2017-09-13 10 views
-5

、私はエラーを取得しています:なぜ演算子<<はうまくいきませんか?以下のコードをコンパイルしている間

Expression.h

class Expression{ 
    ... 
protected: 
    std::ostream Os; 
}; 

Expression.c

Expression::Expression() : Os(std::cout) 
{ 
    ... 
} 

Expression::Expression(std::ofstream &os) : Os(os) 
{ 
    ... 
} 

Expression::Dump() 
{ 
    Os << "=============================================================" << std::endl; 
    Os << "Os:    " << Os << std::endl; 
} 

error: no match for 'operator<<' (operand types are 'std::basic_ostream<char>' and 'std::ostream {aka std::basic_ostream<char>}')

私のミスですか?それを修正するために私は何をすべきですか?

このようなパラメータに初期値を与えながら、Os(std::cout)とはどういう意味ですか?

+4

[最小、***完全な***、および検証可能な例](http://stackoverflow.com/help/mcve)を作成して表示してください。また、[良い質問をする方法について読む](http://stackoverflow.com/help/how-to-ask)をご覧ください。 –

+5

'ostream'をストリームアウトしようとするとどうなりますか?特に 'ostream'を自分自身に流していますか? – BoBTFish

+0

'operator <<'は[documented](http://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt2)として機能します。あなたがドキュメントを読んでいないようだし、エラーメッセージについて十分気にしていないようです。 –

答えて

1

ostreamを別のostreamに書き込む標準operator<<がないためにエラーが発生しています。あなたはOsメンバーが代わりに参照として宣言する必要があり、その後に書き込みをExpressionため出力ostreamを指定しようとしているので、もし

また、ostreamは、別のostreamからコピーを構築することはできません。

class Expression { 
    ... 
protected: 
    std::ostream &Os; 
}; 

Expression::Expression() : Os(std::cout) 
{ 
    ... 
} 

Expression::Expression(std::ofstream &os) : Os(os) 
{ 
    ... 
} 

Expression::Dump() 
{ 
    Os << "=============================================================" << std::endl; 
    Os << "Os: " << SomethingThatIsNotOs << std::endl; 
} 
+0

私は2番目の文に同意しません。いくつかの 'std :: ostream&operator <<(std :: ostream&、std :: ostream&)'を定義すると、奇妙なことですが、無限の再帰を作ることはまずありません –

2

Os << "Os:    " << Os << std::endl; 

は、私たちはその完全な機能栄光にそれを解凍してみましょう考えてみます。

std::ostream& t1 = Os.operator <<("Os:    "); 
std::ostream& t2 = t1.operator <<(Os);     // << Here 
std::ostream& t3 = t2.operator <<(std::endl); 

問題は行が "ここに" と記されています。あなたは自分自身にostreamをストリーミングしています。これは無意味です。あなたは何をしようとしているのですか?

あなたはストリーム用の出力に識別子をしようとしている場合は、アドレスを使用する必要があります。

Os << "Os:    " << &Os << std::endl; 

あなたがstdoutに出力するストリームの内容をしようとしている場合、あなたはOsを可能にする必要がありostringstream、その後、出力文字列バッファ:知識をひけらかすため

std::ostringstream Os; 
    ... 
    std::stdout << "Os:    " << Os.str() << std::endl; 

注:私は、関数呼び出しとinitializatに元の行の私の内訳を信じますイオンはこの特定のケースでは実際には同じです(一時的なオブジェクトがないため、参照のみです)。一般的に、一時的な人生の生涯は微妙に異なるかもしれません。

関連する問題