我正在学习c ++,遇到转换运算符的问题。我正在创建一个复杂的类,该类可以对复数执行基本操作。
class complex
{
double real, img;
public:
complex(double re=0,double im=0){
real = re;
img = im;
}
double get_real() const{
return real;
}
double get_img() const{
return img;
}
};
我超载+运算符:
complex operator+(complex a,complex b){
return complex(a.get_real()+b.get_real(),a.get_img()+b.get_img());
}
由于构造函数的原因,使用双数/整数与复数进行此代码加法效果很好。
complex a(2,4);
complex b = 1+a;
但是当我在类中使用转换运算符
operator int(){
int re = real;
return re;
}
加倍弯曲/内弯的工作方式
b = 1 + a;
// ambiguous overload
这似乎很奇怪,任何人都可以解释一下添加转换运算符如何造成这种歧义?
我在网上找不到任何资源。
答案 0 :(得分:4)
在此表达式语句中
b = 1 + a;
可以使用转换构造函数将操作数1
转换为复杂类型,也可以使用转换运算符将对象a转换为int类型。
因此,两个二进制运算符+之间存在歧义:+可以使用类型为int的内置运算符,或者可以使用类型为complex的用户定义运算符。
为避免歧义,您可以例如将转换运算符声明为显式的。
explicit operator int() const {
int re = real;
return re;
}