5

私は、主に Overland の C++ Without Fear に基づいて、最初のクラスを作成しています。オーバーロードされた友人の ostream operator<< を作成しました。これは正常に動作します。* 演算子もオーバーロードしましたが、うまくいきました。うまくいかないのは、 * 演算子の結果を直接出力しようとしたときです。

BCD bcd(10);  //bcd is initialised to 10
BCD bcd2(15); //bcd2 is initialised to 15
cout << bcd;  //prints 10
bcd2 = bcd2 * 2; //multiplies bcd2 by 2
cout << bcd2; //prints 30

cout << bcd * 2 //SHOULD print 20, but compiler says
//main.cpp:49: error: no match for 'operator<<' in 'std::cout << BCD::operator*(int)(2)'

情報については、ここに私のプロトタイプがあります:

BCD operator*(int z);
friend ostream &operator<<(ostream &os, BCD &bcd);

私が知る限り、operator* は BCD を返すので、operator<< はそれを出力できるはずです。助けてください!

4

1 に答える 1

12

何が起こっているかというbcd * 2と、一時的な を生成しておりBCD、これは にバインドできませんBCD &<<演算子を次のいずれかに置き換えてみてください。

friend ostream &operator<<(ostream &os, const BCD &bcd);

また

friend ostream &operator<<(ostream &os, BCD bcd);

あるいは

friend ostream &operator<<(ostream &os, const BCD bcd);

非定数参照へのバインドとは異なり、一時変数を定数参照にバインドすることは明示的に許可されているため、最初のものは機能します。他のものは、一時変数のコピーを作成することによって機能します。

編集:コメントに記載されているように、ほとんどの場合、 const & version を優先します。これは、ストリーミング オペレーターでオブジェクトを変更すると、クラスを使用する人にとって驚くべきことだからです。これをコンパイルするには、必要constに応じてクラス メンバー関数に宣言を追加する必要がある場合があります。

于 2009-01-16T21:03:53.383 に答える