【问题标题】:no operator >> matches these operands没有运算符 >> 匹配这些操作数
【发布时间】:2013-01-25 07:33:01
【问题描述】:

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

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 &gt;&gt; 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)

【问题讨论】:

  • 你能构造一个minimal test-case吗?目前,尚不清楚错误消息对应的确切内容。
  • 我真的不熟悉SSCCE。你的意思是你想让我展示类似的东西:Complex c; cout > c;
  • 你知道C++标准库已经有complex numbers?
  • 查看一个独立的示例代码以及您尝试编译它时收到的确切错误消息会很有帮助。
  • @JoachimPileborg 是的,但这是一本建议不要使用 C++ 中的复数的书中的练习

标签: c++ iostream istream


【解决方案1】:

错误在这一行:

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

这被解释为

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

这里的问题是你不能有这样的一行,你从输出切换到cout 并从is 开始读取。更好的方法是

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

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

希望这会有所帮助!

【讨论】:

  • 我只是在您发布答案之前将其更改为您所说的内容哈哈。但是谢谢:)
【解决方案2】:

错误在这一行:

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

你的意思是在最后一个上使用 > 吗?由于您使用了>>,它试图将“is”写入cout,但没有运算符

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 2018-05-02
    相关资源
    最近更新 更多