C++ 旧结构运算符重载语法更改了吗?
C++ old struct operator overloading syntax changed?
我正在构建 20 多年前的旧 CPP 代码,但是 g++ 给出了构建错误。有人可以向我解释发生了什么变化吗?谢谢。 (在 turbo C 中很好)
错误:
t_overload.cpp:8:40: error: no matching constructor for initialization of 'Point'
Point operator+(Point& v) { return Point(x+v.x, y+v.y); }
^~~~~~~~~~~~~~~~~~~
cpp 文件:
#include <stdio.h>
struct Point {
int x, y;
// Point(Point& v) {set(v.x, v.y);} // build okay without this line; error if uncomment
Point(int a, int b) {set(a,b);}
void set(int a, int b) {x=a, y=b;}
Point operator+(Point& v) { return Point(x+v.x, y+v.y); }
};
int main() {
Point a(1,2);
Point b(a);
Point c = a + b;
printf("%d %d\n", c.x, c.y);
}
Point(Point& v)
复制构造函数应该采用 const
ant 参数,这应该是:
Point(const Point& v)
但是鉴于复制构造函数的作用,它是完全没有必要的。你可以完全摆脱它。
Point operator+(Point& v)
同样,重载的参数应该是常量:
Point operator+(const Point& v)
见"What are the basic rules and idioms for operator overloading?"
这两个问题,以及相当微妙和微妙的重载规则以及临时对象如何绑定到函数参数,导致了您的编译错误。
我正在构建 20 多年前的旧 CPP 代码,但是 g++ 给出了构建错误。有人可以向我解释发生了什么变化吗?谢谢。 (在 turbo C 中很好)
错误:
t_overload.cpp:8:40: error: no matching constructor for initialization of 'Point'
Point operator+(Point& v) { return Point(x+v.x, y+v.y); }
^~~~~~~~~~~~~~~~~~~
cpp 文件:
#include <stdio.h>
struct Point {
int x, y;
// Point(Point& v) {set(v.x, v.y);} // build okay without this line; error if uncomment
Point(int a, int b) {set(a,b);}
void set(int a, int b) {x=a, y=b;}
Point operator+(Point& v) { return Point(x+v.x, y+v.y); }
};
int main() {
Point a(1,2);
Point b(a);
Point c = a + b;
printf("%d %d\n", c.x, c.y);
}
Point(Point& v)
复制构造函数应该采用 const
ant 参数,这应该是:
Point(const Point& v)
但是鉴于复制构造函数的作用,它是完全没有必要的。你可以完全摆脱它。
Point operator+(Point& v)
同样,重载的参数应该是常量:
Point operator+(const Point& v)
见"What are the basic rules and idioms for operator overloading?"
这两个问题,以及相当微妙和微妙的重载规则以及临时对象如何绑定到函数参数,导致了您的编译错误。