Компилируя ваш исходный код с помощью g cc -9 в Ubuntu 18.04, я получаю следующее:
test.cpp:27:24: error: call of overloaded ‘dummy(myClass&)’ is ambiguous
27 | dummy val = (dummy)mc1;
| ^~~
test.cpp:7:14: note: candidate: ‘dummy::dummy(int)’
7 | explicit dummy(int x = 0) : x{ this->x = x } {}; //explicit has no effect here
| ^~~~~
test.cpp:4:7: note: candidate: ‘constexpr dummy::dummy(const dummy&)’
4 | class dummy{
| ^~~~~
test.cpp:4:7: note: candidate: ‘constexpr dummy::dummy(dummy&&)’
Что происходит, компилятор не может сказать, хотите ли вы создать новый класс 'dummy' из преобразования int в 'myClass' или в новый 'dummy' из неявно сгенерированного оператора копирования 'dummy'.
Это вызывает al oop, где myClass можно преобразовать в оба значения int
и dummy
, что означает, что компилятор застревает, пытаясь преобразовать «myClass», поскольку он не знает, что вы на самом деле хотите сделать - преобразовать в «пустышку», преобразовать в «пустышку», затем скопировать или создать новую «пустышку» с помощью преобразование 'myClass' в int
Решением этого является сделать ваш оператор преобразования в int explicit
, это предотвращает неявное преобразование компилятором и позволяет этому работать (по крайней мере, на g cc - 9).
Это обновленная копия вашего кода, которая будет работать:
using namespace std;
class dummy{
public:
int x;
explicit dummy(int x=0) : x(x) {}
};
class myClass {
public:
explicit operator int(); // < Set to explicit
explicit operator dummy();
};
myClass::operator int() {
return 10;
}
myClass::operator dummy(){
return dummy(9);
}
int main() {
myClass mc1;
dummy val = static_cast<dummy>(mc1);
cout << "mc1 int cast: " << static_cast<int>(mc1) << endl;
cout << "val.x: :" << val.x << endl;
std::cin.get();
return 0;
}
Это компилируется с g cc -9 и clang ++ - 9
В качестве примечания пожалуйста, пожалуйста, пожалуйста, никогда не используйте C приведения в стиле C ++, они подвержены ошибкам и боль в заднице для отладки