2016-06-27 9 views
0

私はここで何か間違っていますが、わかりません。私はプログラムの出力が「タコス!」と期待していますが、代わりにメモリの場所を取得しています。(C++ 14)演算子<<スマートポインタのベクトルからオーバーロードが期待通りに機能しない

私はC++ 14の機能を使用しようとしています。このプログラムでは、スマートポインタを使用して、< <演算子をオーバーロードしようとしています。

tacoCalendarオブジェクトには、tacoCuesの初期化時に作成されるtacoTuesdaysオブジェクト用のベクトルスマートポインタがあります。 cout << month.my_tacoTuesdays.at(0).get();行は、のtacoTuesdaysベクトルの最初のスマートポインタの肩書きをfriend関数friend std::ostream& operator<<(std::ostream& os, const tacoTuesdays& tt);に送信して、 "tacos!"返されてstd::coutに送信されます。

コード:

#include <iostream> 
#include <vector> 
#include <string> 
#include <memory> 

class tacoTuesdays { 
public: 
    tacoTuesdays(int i) { 
     _i = i; 
    } 
    friend std::ostream& operator<<(std::ostream& os, const tacoTuesdays& tt); 
private: 
    int _i; 
}; 

std::ostream& operator<<(std::ostream& os, const tacoTuesdays& tt) { 
    std::string str_out = "tacos!"; 
    os << str_out; 
    return os; 
} 

typedef std::shared_ptr<tacoTuesdays> smart_tacoTuesdays_t; 

class tacoCalendar { 
public: 
    std::vector<smart_tacoTuesdays_t> my_tacoTuesdays; 
    tacoCalendar(int i) { 
     smart_tacoTuesdays_t tt(new tacoTuesdays(i)); 
     my_tacoTuesdays.push_back(tt); 
    } 
    ~tacoCalendar() { 
    } 
private: 
}; 

int main(int argc, char **argv) { 
    using namespace std; 
    tacoCalendar month(2); 
    cout << *month.my_tacoTuesdays.at(0).get(); 
    return 0; 
} 

答えて

4

std::shared_ptr<T>::get()T*を返しますが、あなたのoperator<<過負荷(正しくは)参照ではなく、ポインタを取ります。

変更

cout << month.my_tacoTuesdays.at(0).get(); 

cout << *month.my_tacoTuesdays.at(0); 

したり、任意のshared_ptrインスタンスは、nullになることができるかどう

if (auto* p = month.my_tacoTuesdays.at(0).get()) { 
    cout << *p; 
} 
+3

あなたは 'に.get()'のいずれか – povman

+1

@povmanを必要としません:確かにあなたが望む結果を得るために

、あなたはこのように、tacoTuesdaysconst referenceを渡す必要があります! – ildjarn

+0

ここで「auto * p =」とは何をしていますか? –

3

ご注意coutのタイプ:

cout << month.my_tacoTuesdays.at(0).get(); 

ポインタtacoTuesdays*であるstd::vector<std::shared_ptr<tacoTuesdays>>::at(0).get(0)を印刷していますので、coutはあなたのために生ポインタアドレスを出力します。

cout << *month.my_tacoTuesdays.at(0); 
関連する問題