重载左移和右移操作员(cin和cout)

时间:2015-02-19 14:00:21

标签: c++

我已经制作了一个Point类here。当我写

时,一切正常
cout << p1 << endl; //which p is a Point

但当我有两个Point对象并写

cout << (p1 + p2) << endl; //or (p1 - p2) and etc...

我收到错误。你可以在这里看到错误。我不知道原因。请帮忙。

3 个答案:

答案 0 :(得分:4)

您的问题是您试图将rvalue传递给接受非const左值引用的函数。这是invalid。要解决此问题,只需通过const引用获取Point参数:

ostream &operator<<(ostream &output, const Point &p);

答案 1 :(得分:3)

错误应来自输出操作员签名:而不是:

ostream &operator<<(ostream &output, Point &p){
    output << '(' << p._x << ", " << p._y << ')';
    return output;
}

你应该:

ostream &operator<<(ostream &output, const Point &p) { // notice const here
    output << '(' << p._x << ", " << p._y << ')';
    return output;
}

这是因为(p1 + p2)返回一个临时的,需要绑定到 const 引用。

答案 2 :(得分:0)

Here已更正代码

您需要添加const说明符,例如

ostream &operator<<(ostream&, const Point&);

它是offtopic,但你的输入不适用于输出,因为你读了两个用空格分隔的双打,但输出括号和逗号。