перегрузка операторов и перегрузка функций, приводящая к неоднозначной ошибке компилятора - PullRequest
0 голосов
/ 13 марта 2019

В данном коде я не могу понять, почему компилятор выдает ошибки при вызове функции.Он передает объект класса test, у которого есть член данных класса test2

class Test2 {
    int y;
};

class Test {
    int x;
    Test2 t2;
public:
    operator Test2 () {return t2;}
    operator int () {return x;}
};

void fun (int x) { 
    cout << "fun(int) called";
}

void fun (Test2 t) {
    cout << "fun(Test 2) called";
}

int main() {
    Test t;
    fun(t);
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Вызов fun(t); неоднозначен, потому что на него допускаются обе перегрузки fun.

Это опять же, потому что t является Test объектом, который может быть преобразован в оба Test2и int.

Пометка любого из операторов преобразования как explicit решит эту проблему.

См. Демо здесь.

0 голосов
/ 13 марта 2019

Я не могу понять, почему компилятор выдает ошибки при вызове функции

Как компилятор должен выяснить, какую функцию вызывать?У вас есть две функции в наборе перегрузки, связанные с именем func, и два оператора, которые позволяют неявные преобразования в типы, которые одинаково хорошо соответствуют обоим параметрам функции этого набора перегрузки.

Ситуация идентична

void f(long);
void f(short);

f(42); // Error: both conversions int -> log and int -> short possible

Вы можете исправить это, например,

fun(static_cast<Test2>(t)); // be explicit on the calling side

или пометив один (или оба) оператора преобразования как explicit

explicit operator Test2 () {return t2;}

, что отключаетнеявное преобразование в Test2 и требует явного приведения, как показано ранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...