运算符重载代码编译错误,模板参数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::x
和 Point::y
是私人的,您已经将 operator<<
声明为朋友。)
我正在尝试应用我在以下 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::x
和 Point::y
是私人的,您已经将 operator<<
声明为朋友。)