【发布时间】:2014-05-25 12:50:07
【问题描述】:
我在重载 operator+ i 模板类时遇到问题。 假设我有
template<typename T>
struct point{
//Ctors:
point(){};
point(T _x, T _y):x(_x),y(_y){};
point(const point<T>& p):x(p.x),y(p.y){};
template<typename T2>
point(const point<T2>& p):x(static_cast<T>(p.x)),y(static_cast<T>(p.y)){};
//Coordinates:
T x;
T y;
//Operator overloads:
friend point<T> operator+(point<T> left,point<T> right ){
return point<T>(left.x+right.x, left.y+right.y);
}
template<class T2>
friend point<T> operator+(point<T2> left,point<T> right){
return point<T>(left)+right;
}
template<class T3>
friend point<T> operator+(point<T> left,point<T3> right){
return point<T>(right)+left;
}
};
这在调用时给我一个模棱两可的错误。
point<float> p1(1.2,1.4);
point<int> p2(1,2);
point<float> p3 =p1+p2;
这是有道理的,但你能告诉我如何解决它的好做法吗?
我需要 3 个操作员,否则演员可能会走错方向。例如,忽略最后一个运算符重载将导致 p3.x=2 和 p3.y=4。
非常感谢!
【问题讨论】:
-
为什么需要3个运算符+s?
-
编译器不知道选择哪个函数(T2 或 T3)。区别必须在参数中(而不是在返回类型中)。
-
@AdamFolwarczny 我知道这是模棱两可的,但你能告诉我如何解决它。我真的找不到一个很好的解决方案,它的转换基本上取决于返回类型。
-
表达式模板?
-
如果浮点数始终具有更高的优先级,则将结果作为浮点数返回。如果你将它赋值给 point
那么它将自动转换: template<class T, class T2>point<float> operator+(point<T2> left, point<T> right){return point<float>(left) + point<float>(right);}
标签: c++ templates operator-overloading ambiguity