2015-11-29 4 views
1

Я пытаюсь итерацию через std::list (содержащих) объектов и напечатать некоторые методы, но жалобы компилятора, 'print': is not a member of 'std::shared_ptr<A>' Однако если я создаю объект std::shared_ptr<A> animal(*it); и вызвать animal.print() он будет работать просто отлично, почему это? ниже функция у меня возникают проблемы с (это также небольшой часть моей очень большой программы, включающей много полиморфизма)печатные элементы станд :: список с использованием итератора C++

friend std::ostream& operator<<(std::ostream& out, const Hand& _hand) {   

      std::list< std::shared_ptr<A>>::const_iterator it = _hand.hand.begin();  
      std::shared_ptr<A> animal(*it); 
      animal.print(); //workss 
      while (it != _hand.hand.end()) {    
      it->print(); //doesn't work 
       ++it; 


      } 

    return out;} 

list я перебор имеет типа A (который является абстрактным) и содержат объекты его производных классов.

+1

AFAIK 'animal.print()' не должен работать. –

+0

Компилятор не жаловался! – Bobby

+0

Это должно было быть сделано. –

ответ

3

(*it) возвращает ссылку на интеллектуальный указатель, поэтому вам нужно снова разыменовать его.

(**it).print() или (*it)->print()

Или вы можете найти это аккуратнее, если вы хотите вызвать несколько функций в ряд: const auto& animal = **it; animal.print();

+0

Остановитесь. Спасибо, согласится на этот ответ через 6 минут. Большое спасибо – Bobby

+0

@Bobby, если вы используете SO на мобильном телефоне? Почувствовал, как Пятно поменялось на «Остановить». lol – Jagannath

+0

Использование новых диапазонов для циклов также будет вариантом. для (авто & рука: _hand.hand) рука-> печать(). –

Смежные вопросы