나는 일련의 유형을 가지고 있는데, 서로 자유롭게 변환 할 수 있기를 원합니다. 다음 장난감 예를 생각해상호 변환 가능 유형 및 모호한 호출
struct A {
int value;
A(int v) : value(v) { }
};
struct B {
int value;
B(int v) : value(v) { }
B(A a) : value(a.value) { }
operator A() const { return A(value); }
};
struct C {
int value;
C(int v) : value(v) { }
C(A a) : value(a.value) { }
C(B b) : value(b.value) { }
operator B() const { return B(value); }
operator A() const { return A(B(*this)); } // <-- ambiguous
};
int main(int argc, const char** argv) {
C c(5);
A a(3);
a = c;
}
을 당신이 볼 그래서, 내가 캐스트 생성자를 사용하여 이전의 모든 유형에서 변환 가능하고, 캐스트 연산자를 사용하여 이전의 모든 유형의 전환으로 정의 이후의 각 유형에 노력하고있어.
In member function ‘C::operator A() const’:
19:40: error: call of overloaded ‘B(const C&)’ is ambiguous
19:40: note: candidates are:
9:3: note: B::B(A)
6:8: note: constexpr B::B(const B&)
6:8: note: constexpr B::B(B&&)
일을 변경하지 않습니다 static_cast<A>(static_cast<B>(*this))
에 식 변경 : C::operator A
의 정의 4.7 gcc를하는 모호한있어서, 그대로 아아,이 의도 한대로 작동하지 않습니다. 해당 행을 모두 제거하면 암시 적 변환 시퀀스에 둘 이상의 사용자 정의 변환을 사용할 수 없으므로 main
에 오류 메시지가 표시됩니다. 내 장난감의 예에서는 C
에서 A
으로 변환을 수행 할 수 있지만 실제로 사용하면 많은 중복 코드가 발생할 수 있으므로 다른 변환 연산자를 다시 사용하는 솔루션이 필요합니다.
그래서 변환 코드를 복제하지 않고 자유롭게 상호 변환 할 수있는 세 가지 유형을 얻을 수 있습니까?
, 당신은 'shouldn 변환 생성자와 변환 연산자가 각각 필요합니다. 모든 클래스에서 컨버전 생성자를 제공하면 모호함을 피할 수 있습니다. – Angew
@Angew, 변환 생성자에만 문제가 있으므로 위임하기가 어렵습니다. 자바에서는 생성자가'this (...) '를 사용하여 다른 생성자에게 위임 할 수 있지만 C++에 대해서는 그런 메커니즘이 없다는 것을 알고 있습니다. 그래서 모든 생성자는 모든 작업을 모두 혼자서해야 할 것입니다. – MvG
@MvG : C++ 11은 위임자 생성자를 지원합니다. http://www.nullptr.me/2012/01/17/c11-delegating-constructors/#.URud1lpp6G4 –