没有运营商>>匹配这些操作数

时间:2013-02-09 20:16:47

标签: c++ iostream istream

我一直在尝试重载>>运算符。我有一个有两个私有变量的类:

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)

2 个答案:

答案 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。