2013-11-19 3 views
0

Сегодня у меня возникла проблема с передачей std :: unique_ptr в функцию/перегруженный оператор. Например:умный указатель в функции

HEADER 
class SpaceMarine{ 
    public: 
     ... 
     friend std::ostream & operator << (std::ostream &exit, const SpaceMarine &SM); 

    private: 
     std::string name_; 
     .... (some other few parameters) 
     std::unique_ptr<armor> armor_; 

И в .cpp я получил:

std::ostream & operator << (std::ostream &exit, const SpaceMarine& SM){ 

    exit << ... << *SM.stats_ << !!!!!! << *SM.weapon_; 
    return exit; 
} 

stats_ и weapon_ оба класса, которые являются членами основного класса через указатели. Для всех классов их собственные перегруженные операторы >> и < < работ (то есть - когда я просто пишу:

std::cout << armor1; 
or 
std::cin >> weaponb; 

они работают).

Итак: что мне нужно положить на место !!!!!! , для unique_ptr работать аналогично * SM.stats_? Поэтому он указывает на перегруженный оператор класса брони и использует его в перегруженном операторе основного класса?

EDIT

Для MikeSeymour:

std::ostream & operator << (std::ostream &exit, const Armor& arm){ 
    return exit << "\n" << arm.name_ << " AR: " << arm.toughness_; 
} 

, но, как я уже писал раньше - перегруженные операторы для классов членов (брони, оружие) работы.

+2

Умный указатель может использоваться так же, как и обычный указатель, так что, например, '* armor_' будет работать одинаково, если это« обычный »указатель или умный указатель. См. [ 'Станд :: unique_ptr :: оператор *'] (http://en.cppreference.com/w/cpp/memory/unique_ptr/operator*). –

+0

Так это 'armor' или' Armor'? У вас есть два разных типа, или это одна ошибка копирования/вставки? Вопрос будет легче ответить, если вы представили полный (но небольшой) пример, чтобы точно показать, что не так, когда вы пытаетесь вывести '* armor_' и полное сообщение об ошибке. –

ответ

3

Вы должны просто устранить его (возможно, проверить до того, что это действительно).

exit << ... << *SM.stats_ << *SM.armor_ << *SM.weapon_; 
+0

проблема есть, я уже пробовал это, и он не работает – WarmasterMazuran

+0

@WarmasterMazuran, что за ошибка? – Till

+1

@ WarmasterMazuran он не может работать только и только если ваш 'operator <<' для брони ожидает неконстантной ссылки в качестве второго параметра. – ForEveR

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