2

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

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 question 中的一个答案中,有人建议写入局部变量并设置对象变量,例如:

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

这里的问题是你不能有这样一条线,你可以从输出切换coutis. 更好的方法是

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

也就是说,这是一个非常糟糕的主意。您不应该operator >>显示提示,因为这意味着如果您想从文件中读取您的类型的对象,每次您这样做时都会real在屏幕上显示提示“”。您应该operator >>刚刚阅读了该表示,并在阅读之前明确提示您是否想要这样做。

希望这可以帮助!

于 2013-02-09T20:35:13.377 回答
1

错误在这一行:

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

您的意思是在最后一个上使用 << 而不是 >> 吗?由于您使用了 >>,它试图将“is”写入cout,但没有运算符 << 的重载,它需要一个 basic_ostream 和一个 basic_istream。

于 2013-02-09T20:35:31.470 回答