运算符重载代码编译错误,模板参数deduction/substitution失败

Operator overloading code compilation error, template argument deduction/substitution failure

我正在尝试应用我在以下 C++ 中学到的运算符加载的一些概念 class。

#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 上编译并运行良好。但是当我尝试在 Linux 上使用 gcc 编译它时,它会抛出一长串错误:

In file included from /usr/include/c++/4.8/iostream:39:0, from optr_overload.cpp:1: /usr/include/c++/4.8/ostream:471:5: note: template std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, _CharT) operator<<(basic_ostream<_CharT, _Traits>& __out, _CharT __c) ^ /usr/include/c++/4.8/ostream:471:5: note: template argument deduction/substitution failed: optr_overload.cpp:53:30: note:
deduced conflicting types for parameter ‘_CharT’ (‘char’ and ‘Point’) cout << "a + b is: " << a + b << endl;

我知道问题出在我将 "a + b" 传递给重载二进制流插入运算符的那一行,它只接收对一个 Point 对象的引用作为参数。但是除了将 "a + b" 分配给第三个对象并将该单个对象作为参数传递给“<<”之外,我不知道如何修复代码。有人可以向我解释到底需要做什么才能让 gcc 编译我的代码,最好不涉及使用额外的占位符对象。

a + b 计算的值是一个临时对象,因此不能作为 Point& 传递给 operator<<;该语言只允许将临时变量作为 const Point& 传递。只需更改输出运算符的声明以接受 const Point&.

允许将临时结果作为非常量引用传递是旧版本 VC++ 中的一个已知错误。

你几乎一切都正确,但你的 ostream& operator<<() 应该通过 const 引用获取 Point:

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

这应该可以解决您的问题。

(不用担心 Point::xPoint::y 是私人的,您已经将 operator<< 声明为朋友。)