运算符重载代码编译错误,模板参数推断/替换失败

时间:2015-03-14 06:26:53

标签: c++ gcc operator-overloading argument-passing

我试图应用我在以下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编译我的代码需要做些什么,最好不要使用额外的占位符对象。

2 个答案:

答案 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::xPoint::y是私密的,您已经将operator<<宣布为朋友。)