与转换运算符和构造函数的歧义

时间:2020-02-28 08:35:57

标签: c++ type-conversion operator-overloading

我正在学习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

这似乎很奇怪,任何人都可以解释一下添加转换运算符如何造成这种歧义?
我在网上找不到任何资源。

1 个答案:

答案 0 :(得分:4)

在此表达式语句中

b = 1 + a;

可以使用转换构造函数将操作数1转换为复杂类型,也可以使用转换运算符将对象a转换为int类型。

因此,两个二进制运算符+之间存在歧义:+可以使用类型为int的内置运算符,或者可以使用类型为complex的用户定义运算符。

为避免歧义,您可以例如将转换运算符声明为显式的。

 explicit operator int() const {
        int re = real;
        return re;
    }
相关问题