문제가 발생하여 설명하기 어렵습니다. 여기에 최소한의 재현 코드는 모두 GCC 6.2 연타 3.9에 실패입니다 : 내가 T2에 T1 변환하는 특정 생성자를 작성하지 않은명시 적 사용자 정의 캐스트 연산자를 사용하는 함수 호출이 모호합니다.
class T2;
class T1
{
int field1;
public:
T1(int pf) : field1(pf) {}
operator int() { return field1; }
operator T2();
};
class T2
{
int field2;
public:
T2(int pf) : field2(pf) {}
};
T1::operator T2() { return T2(field1); }
void foo(T2 pt) {}
int main()
{
T1 obj1(1);
T2 obj2(2);
foo((T2) obj1); // ambiguous conversion for C-style cast from 'T1' to 'T2'
foo(T2(obj1)); // ambiguous conversion for functional-style cast from 'T1' to 'T2'
foo(static_cast<T2>(obj1)); // ambiguous conversion for static_cast from 'T1' to 'T2'
}
참고, 그래서 그것을 모두해야 추측 유일한 방법은 사용자 정의 캐스트 연산자를 사용하는 것입니다 컴파일러에 명확.
// operator int() { return field1; }
다음 코드는 문제없이 컴파일 :
호기심 사실은 내가 관련이 없어 보이는 캐스트 연산자를 주석 때이다. 그 이유는 무엇입니까?
흥미롭게도 암시 적 캐스트 (즉, foo (obj1))가 올바르게 작동합니다. – Dmitry
암시적인 @Dmitry는 암시 적 변환이 하나만 필요한 연산자 T2를 선택해야하기 때문에 작동합니다. – Danh