我是C ++初学者,试图从在线视频中学习。在操作员重载讲座中的示例时,会出现以下代码并给出错误
error: no match for 'operator<<' in 'std::cout << operator+(((point&)(& p1)), ((point&)(& p2)))'compilation terminated due to -Wfatal-errors.
在标有评论的行上。有人可以告诉代码中有什么问题吗?我正在尝试教授在讲座中解释但无法编译的内容。
===============
#include <iostream>
using namespace std;
class point{
public:
double x,y;
};
point operator+ (point& p1, point& p2)
{
point sum = {p1.x + p2.x, p1.y + p2.y};
return sum;
}
ostream& operator<< (ostream& out, point& p)
{
out << "("<<p.x<<","<<p.y<<")";
return out;
}
int main(int argc, const char * argv[])
{
point p1 = {2,3};
point p2 = {2,3};
point p3;
cout << p1 << p2;
cout << p1+p2; // gives a compliation error
return 0;
}
答案 0 :(得分:3)
这只是const正确性的问题。您的operator +返回一个临时值,因此在调用const
时,您无法绑定非operator<<
引用。签名:
ostream& operator<< (ostream& out, const point& p)
虽然您不需要这样做来修复此编译错误,但除非您同样修复const
,否则您将无法添加operator+
点:
point operator+(const point& p1, const point& p2)
答案 1 :(得分:0)
将point&
和const point&
的参数类型从operator+
更改为operator<<
。非const引用不能绑定到临时(由operator+
返回)并导致编译错误。
答案 2 :(得分:0)
原因是第二个参数应该是const引用。 (你不希望它被修改,对吧?)所以,就像是,
std::ostream& operator<< (std::ostream &out, const Point &p)
{
out << "(" << p.x << ", " << p.y << ")";
return out;
}