我一直在尝试重载>>
运算符。我有一个有两个私有变量的类:
Class Complex
{
private:
double real;
double imaginary;
};
此外,我还有一个使>>
运算符重载的友元函数:
friend istream & operator>>(istream &is, Complex &c)
在函数的实现中,我尝试了很多方法来写入对象c
的变量,但我一直收到错误no operator >> matches these operands
我环顾四周,读到我需要写入变量的reference
,所以我尝试了以下内容:
istream & operator>>(istream &is, Complex &c)
{
using std::cout;
double &r = c.real;
cout << "real: " << is >> r;
return is;
}
然而,这仍然给我同样的错误。
当我尝试is >> c.real
并且没有工作时,我有点困惑。
在类似SO问题的答案中,有人建议写入局部变量并设置对象变量,如:
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)
答案 0 :(得分:4)
错误在这一行:
cout << "real: " << is >> r;
这被解释为
((cout << "real: ") << is) >> r
这里的问题是你不能有这样的一行,你从输出切换到cout
并开始从is
读取。更好的方法是
cout << "real: ";
is >> r;
那就是说,这是非常糟糕的主意。您不应该operator >>
显示提示,因为这意味着如果您想从文件中读取类型的对象,每次执行此操作都会显示“real
”提示在屏幕上。您应该operator >>
只读取表示,并在阅读之前明确提示您是否想要这样做。
希望这有帮助!
答案 1 :(得分:1)
错误在这一行:
cout << "real: " << is >> r;
您的意思是使用&lt;&lt;而不是&gt;&gt;在最后一个?由于你使用了&gt;&gt;,它试图将“is”写入 cout ,但是没有运算符的重载&lt;&lt;这需要一个basic_ostream和一个basic_istream。