2

>>演算子をオーバーロードしようとしています。2つのプライベート変数を持つクラスがあります。

Class Complex
{
 private:
    double real;
    double imaginary;
};

さらに、>>演算子をオーバーロードするフレンド関数があります。

friend istream & operator>>(istream &is, Complex &c)

関数の実装では、オブジェクトの変数に書き込むために多くの方法を試しましたcが、エラーが発生し続けますno operator >> matches these operands

周りを見回してreference、変数のaに書き込む必要があることを読んだので、次のことを試しました。

istream & operator>>(istream &is, Complex &c)
{
using std::cout;
double &r = c.real;
cout << "real: "  << is >> r;
    return is;
}

ただし、これでも同じエラーが発生します。is >> c.real試してもうまくいかなかったので少し混乱しました。

同様のSO質問の回答の1つで、誰かがローカル変数に書き込み、オブジェクト変数を次のように設定することを提案しました。

double d;
cin >> d;
setReal(d);

メソッドを使用したり、変数をローカルに設定したりするのではなく、これを実現するためのより簡単な方法を見つけようとしています。

解決策は単純なものかもしれませんが、私は実際にはC ++の初心者なので、気楽にやってください:P。

テストケース:

using std::cin;
Complex c;
cin >> c;

正確なエラーメッセージ:

Error   1   error C2678: binary '>>' : no operator found which takes a left-hand operand of type 'std::basic_ostream<_Elem,_Traits>' (or there is no acceptable conversion)
4

2 に答える 2

4

エラーは次の行にあります:

cout << "real: "  << is >> r;

これは次のように解釈されます

((cout << "real: ") << is) >> r

ここでの問題は、出力からに切り替えてからcout読み取りを開始するこのような行を作成できないことですis。これを行うためのより良い方法は

cout << "real: ";
is >> r;

とはいえ、これは非常に悪い考えです。プロンプトを表示する必要はありませんoperator >>。これは、ファイルから自分のタイプのオブジェクトを読み込みたい場合、そのたびにプロンプreal​​ト「」が画面に表示されることを意味します。operator >>表現を読んで、それがやりたいかどうかを読む前に明示的にプロンプ​​トを出す必要があります。

お役に立てれば!

于 2013-02-09T20:35:13.377 に答える
1

エラーは次の行にあります:

cout << "real: "  << is >> r;

最後の1つで>>の代わりに<<を使用するつもりでしたか?>>を使用したため、 coutに「is」を書き込もうとしていますが、basic_ostreamとbasic_istreamを使用するoperator<<のオーバーロードはありません。

于 2013-02-09T20:35:31.470 に答える