2010-06-10 65 views
1
class mystream : public std::stringstream 
{ 
public: 
    void write_something() 
    { 
     this << "something"; 
    } 
}; 

這將產生以下兩個在VC++ 10編譯錯誤:如何在std :: stringstream的後代中調用operator << on「this」

error C2297: '<<' : illegal, right operand has type 'const char [10]' 
error C2296: '<<' : illegal, left operand has type 'mystream *const ' 

從第二個判斷,這是因爲什麼 this點,不能改變,但< <運算符確實(或至少被聲明爲如此)。正確?

是否還有其他一些方法我仍然可以使用<<>>運營商this

回答

8

mystream *const表示this是一個指向非常量對象的常量指針。問題在於你試圖將流插入到指針中 - 你必須插入流中。嘗試以下操作。

*this << "something"; 
+1

呃,顯示我的C#端...謝謝。 – 2010-06-10 09:27:07

1

一個字符串流(實際上是一個basic_stringstream<char>)的析構函數不是虛擬的,並從C++ SL的所有類,你沒有真正應該從中導出...

根據什麼正是你想要做的,我會告訴你更喜歡組合繼承,並可能創建自己的模板化的< <和>>運算符將使用您的基礎流。或者,更明智的做法是不要將stringstream用作成員。

+0

我從http://stackoverflow.com/questions/2196155/is-there-anyway-to-write-the-following-as-a-c-macro得到了我的靈感,它有足夠的票數讓我覺得這種推導是可以接受的。我也發現http://stackoverflow.com/questions/922248/is-there-any-real-risk-to-deriving-from-the-c-stl-containers遵循你的建議。 – 2010-06-10 10:04:03

+0

因爲這個聰明的技巧並不真正的工作,你可以有一些問題? :)嘗試'my_macro << std :: string(「驚喜」)' – Nikko 2010-06-10 10:27:59

+0

日光是正確的關於my_macro。它創建一個匿名的my_stream實例,這個實例只適用於operator <<方法,而不適用於operator << functions。代碼將被編譯,但您可以在不同平臺上生成不同的輸出。 – iain 2010-06-10 11:05:02

相關問題