3

次の演算子オーバーロード プロトタイプがあります。

 ostream& operator<<(ostream & outputstream, my_arr& arr)

 my_arr operator+(const my_arr& left, const my_arr& right)

電話する:

 cout << (arr1 + arr2);

これにより、次のコンパイラ エラーが発生します。

error: no match for ‘operator<<’ in ‘std::cout << operator+(const my_array&, const my_array&)((*(const my_array*)(& y)))’

<< の署名を次のように変更すると、これはなくなります。

  ostream& operator<<(ostream & outputstream, const my_arr& arr)

ここで何か基本的なことが欠けているかもしれませんが、なぜこれが起こるのでしょうか? ご協力いただきありがとうございます。

4

3 に答える 3

4

問題は、参照として渡すときに、加算の結果などの「一時的な」(右辺値) オブジェクトを渡すことができないことです。const 参照を渡す場合、C++ 規則では、一時変数が書き込まれないことが保証されているため、一時変数を渡すことができます。

于 2013-01-18T06:42:14.633 に答える
2

前述したように、この結果は一時的なもの (右辺値) です。次の形式の出力操作のオーバーロードを指定することもできます。

ostream& operator<<(ostream& outputstream, my_arr&& arr);

cout << (arr1 + arr2);次に利用します。

于 2013-01-18T06:50:11.963 に答える
1

タイプミスがあるため、にoperator+渡す必要もありますconst my_arroperator

my_array operator+(const my_arr& left, const my_arr& right)
^^^^ should be my_arr                   ^^^ need to be const

または、オーバーロードする必要がありoperator<<ますmy_array

ostream& operator<<(ostream & outputstream, my_arr& arr)

それ以外の場合、コードはコンパイルされて正常に実行されます:サンプル リンク

于 2013-01-18T07:19:51.933 に答える