2012-11-23 47 views
2

我有一個類MYLIST,它覆蓋<<運營商能夠將其自身登錄到控制檯工作:重載運算符<<控制檯輸出不會爲成員變量

class MyList { 
public: 
    vector<int> *numbers; 
}; 
ostream& operator<<(ostream& os, MyList& l); 

實現:

ostream& operator<<(ostream& os, MyList& l) { 
    for (int i = 0; i < l.numbers->size(); i++) { 
     os << l.numbers->at(i);   
    } 
    return os; 
} 

在另一個類中,我有一個類型爲MyList的成員變量,我無法將其打印到控制檯。有趣的是本地MYLIST變量工作正常:

class A { 
public: 
    MyList list; 
    void someMethod() const; 
}; 

實現:

void A::someMethod() const { 
    MyList local; 
    // Set up local list. 
    cout << "Local:" << local; // OK! 
    cout << "Member:" << list; // ERROR! 
} 

這是錯誤消息:

Invalid operands to binary expression ('basic_ostream<char, 
std::__1::char_traits<char>>' and 'const MyList') 

Xcode的自動修復建議參考list

cout << "Member:" << &list; 

這將編譯,但(顯然)它打印list的地址,而不是我的內容。我不明白這兩個變量與<<運營商有什麼不同。有人可以解釋嗎?

+0

由於缺少** **分號類A的定義後,這是不可能的編譯器會走這麼遠,你要求,然後發出一些錯誤診斷。這真的是你的真實代碼嗎?如果不是,你認爲我們可以推斷出你真正的代碼是什麼? –

回答

6

我不認爲這是你真正的代碼,但這裏是我的猜測:

ostream& operator<<(ostream& os, const MyList& l) 
//         | 
//        note const 

要麼,一些真正愚蠢像遺忘尾隨;

+0

我同意,這又是(最有可能)一個相信心靈感應的人的例子。知道他們都來自何種文化,這將會很有趣。例如,阿蘭圖靈,一個非常聰明的人,[聲稱相信ESP](http://www.turing.org.uk/philosophy/ex9.html),他嵌入了20世紀40年代的英國文化(我的結論是在那種文化中,這似乎是社會必要的,或者至少在社會上似乎相信ESP)。 –

+0

我沒有'const',謝謝。我從我的C++書中得到了這段代碼... – Jawap

+0

@ Cheersandhth.-Alf Telepathy?你在說什麼? – Jawap

2

看來,你在幾個地方省略了const:就目前而言,你的代碼應該沒問題。但是,如果您有const成員函數,則成員爲const,您不能將非const引用綁定到const對象。因此,輸出操作符通常聲明採取了const&作爲第二個參數:

std::ostream& operator<< (std::ostream& os, MyList const& l) { 
    ... 
}