2011-01-31 12 views
4

私は、文字列の変換演算子を持つクラスfoobarに持っているため一致:私はそれを使用しようとする'演算子<<' のstdで::演算子<< [_Traits =のstdと:: char_traits <char>]

#include <string> 

class Foobar 
{ 
public: 
    Foobar(); 
    Foobar(const Foobar&); 
    ~Foobar(); 

    operator std::string() const; 
}; 

をこのように:

// C++のソースファイル

#include <iostream> 
#include <sstream> 
#include "Foobar.hpp" 

int main() 
{ 
    Foobar fb; 
    std::stringstream ss; 

    ss << "Foobar is: " << fb; // Error occurs here 

    std::cout << ss.str(); 
} 

私は明示的にfoobarのためにオペレータ< <を作成する必要がありますか?。 FooBarはiostreamに配置される前に文字列に変換され、std :: stringにはすでに演算子があるので、なぜ必要なのかわかりません。< <が定義されています。

なぜこのエラー?私は何が欠けていますか?

[編集]は

私はこれに、私はラインを変更した場合、エラーがで発生していることが分かった:それは正常にコンパイル

ss << "Foobar is: " << fb.operator std::string(); 

。 Urgh ...!コンパイラが自動変換(Foobar - > string)を実行できないのはなぜですか?

これを解決するためのベストプラクティスの方法は何ですか?上記の醜い構文を使用する必要はありません。

+0

http://stackoverflow.com/q/6677072/560648? –

答えて

6

フーバーfbは、ストリームに配置される前に文字列に変換されません。 < <演算子への引数は文字列でなければならないという要件はありません。

あなたは

ss << "Foobar is: " << std::string(fb); 

それともfoobarのためにオペレータ< <を定義し、手動で文字列に変換しなければならないのいずれか。

< <を定義することは賢明な方法です。演算子で文字列変換を呼び出すだけの理由はありません< <コードです。

関連する問題