我有一个班级,我正在重载<<和+这样的运营商:
friend MyObject operator+(MyObject lhs, MyObject rhs){
MyObject obj;
obj.Property = lhs.Property + rhs.Property;
return obj;
}
friend std::ostream& operator<<(std::ostream& os, MyObject& n) {
os << MyObject.Property; //property is a double
return os;
}
这在Visual Studio和gnu ++ 98中编译都没有问题。我也可以这样称呼它们没有任何问题:
MyObject obj1, obj2;
obj1.PutInValidState();
cout << obj1;
obj1 = obj1 + obj2;
然而,当我同时打电话给他们时:
cout << obj1 + obj2;
Visual Studio将编译它(并提供正确的输出),但是gnu ++ 98给出了错误“不匹配'运算符&lt;&lt;'在'' std :: operator&lt;&lt;(std :: basic_ostream&amp;,const char *)“。我可以通过在函数定义中向参数添加const来编译它,如下所示:
friend std::ostream& operator<<(std::ostream& os, const MyObject& n) {
这里发生了什么?为什么我需要使const在gnu ++ 98中工作,而不是在Visual Studio中工作?
答案 0 :(得分:2)
cout << obj1 + obj2;
是
的语法糖operator<<(cout, operator+(obj1,obj2));
在这里,您可以看到运算符&lt;&lt;()重载中的n
参数绑定到operator +()返回的值,该值是临时对象。现在,在C ++中,有一条规则,非const引用参数可以不绑定到temporaries,这就是为什么它不能在gcc中编译。