неоднозначность с оператором преобразования и конструктором - PullRequest
3 голосов
/ 28 февраля 2020

Я изучаю c ++, столкнулся с проблемой с оператором преобразования. Я создаю сложный класс, который может выполнять базовые 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;
}

Добавление с двойной / int согнутой работой

b = 1 + a;
// ambiguous overload

Это кажется странным, кто-нибудь может объяснить, как добавление оператора преобразования создает эту двусмысленность? Я не смог найти ни одного ресурса в сети.

1 Ответ

4 голосов
/ 28 февраля 2020

В этом выражении выражения

b = 1 + a;

либо операнд 1 может быть преобразован в комплекс типов с помощью конструктора преобразования, либо объект a может быть преобразован в тип int с помощью оператора преобразования.

Таким образом, существует двусмысленность между двумя бинарными операторами +: можно использовать либо встроенный оператор для типа int, либо пользовательский оператор для комплекса типов.

To Избегайте неоднозначности, которую вы можете, например, объявить оператором преобразования как явным.

 explicit operator int() const {
        int re = real;
        return re;
    }
...