我试图应用我在以下C ++课程中学到的一些操作符加载概念。
#include<iostream>
using namespace std;
class Point
{
private:
int x, y;
public:
Point(int, int);
Point operator+(const Point&);
friend istream& operator>>(istream& in, Point&);
friend ostream& operator<<(ostream& out, Point&);
Point operator=(const Point&);
};
Point::Point(int x = 0, int y = 0)
:x(x), y(y){}
Point Point::operator+(const Point& p)
{
int r1, r2;
r1 = x + p.x;
r2 = y + p.y;
return Point(r1, r2);
}
Point Point::operator=(const Point& p)
{
this->x = p.x;
this->y = p.y;
return *this;
}
istream& operator>>(istream& in, Point& p)
{
char openParenthesis, closeParenthesis, comma;
cout << "Enter data in the format (1,2): ";
in >> openParenthesis >> p.x >> comma >> p.y >> closeParenthesis;
return in;
}
ostream& operator<<(ostream& out, Point& p)
{
out << "(" << p.x << "," << p.y << ")";
return out;
}
int main()
{
Point a, b;
cin >> a >> b;
cout << "a + b is: " << a + b << endl;
return 0;
}
代码在Visual Studio上编译并运行正常。但是当我尝试使用gcc在Linux上编译它时,它会抛出一长串错误:
在/usr/include/c++/4.8/iostream:39:0中包含的文件中, 来自optr_overload.cpp:1:/usr/include/c++/4.8/ostream:471:5:注意:模板std :: basic_ostream&lt; _CharT,_Traits&gt;&amp; std :: operator&lt;&lt;(std :: basic_ostream&lt; _CharT,_Traits&gt;&amp;,_CharT) 运算符&lt;&lt;(basic_ostream&lt; _CharT,_Traits&gt;&amp; __out,_CharT __c) ^ /usr/include/c++/4.8/ostream:471:5:注意:模板参数扣除/替换失败:optr_overload.cpp:53:30:注意:
推导出参数'_CharT'('char'和'Point')的冲突类型 cout&lt;&lt; &#34; a + b是:&#34; &LT;&LT; a + b&lt;&lt; ENDL;
我明白问题出在我通过的地方&#34; a + b&#34;到重载的二进制流插入操作符,它只接收对一个Point对象的引用作为参数。但我不知道如何修改代码而不是分配&#34; a + b&#34;到第三个对象并将该单个对象作为参数传递给&#34;&lt;&lt;&#;&#34;。有人可以向我解释为了让gcc编译我的代码需要做些什么,最好不要使用额外的占位符对象。
答案 0 :(得分:1)
使用a + b
计算的值是临时对象,因此无法作为Point&
传递给operator<<
;该语言仅允许临时传递为const Point&
。只需更改输出运算符的声明即可接受const Point&
。
允许将临时结果作为非const引用传递是旧版VC ++中的一个已知错误。
答案 1 :(得分:1)
你几乎所有东西都是正确的,但你的ostream& operator<<()
应该通过const引用来获取Point:
friend ostream& operator<<(ostream& out, const Point&);
这可以解决您的问题。
(并且不要担心Point::x
和Point::y
是私密的,您已经将operator<<
宣布为朋友。)