2013-02-13 5 views
0

나는 일련의 유형을 가지고 있는데, 서로 자유롭게 변환 할 수 있기를 원합니다. 다음 장난감 예를 생각해상호 변환 가능 유형 및 모호한 호출

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으로 변환을 수행 할 수 있지만 실제로 사용하면 많은 중복 코드가 발생할 수 있으므로 다른 변환 연산자를 다시 사용하는 솔루션이 필요합니다.

그래서 변환 코드를 복제하지 않고 자유롭게 상호 변환 할 수있는 세 가지 유형을 얻을 수 있습니까?

+0

, 당신은 'shouldn 변환 생성자와 변환 연산자가 각각 필요합니다. 모든 클래스에서 컨버전 생성자를 제공하면 모호함을 피할 수 있습니다. – Angew

+0

@Angew, 변환 생성자에만 문제가 있으므로 위임하기가 어렵습니다. 자바에서는 생성자가'this (...) '를 사용하여 다른 생성자에게 위임 할 수 있지만 C++에 대해서는 그런 메커니즘이 없다는 것을 알고 있습니다. 그래서 모든 생성자는 모든 작업을 모두 혼자서해야 할 것입니다. – MvG

+1

@MvG : C++ 11은 위임자 생성자를 지원합니다. http://www.nullptr.me/2012/01/17/c11-delegating-constructors/#.URud1lpp6G4 –

답변

1

을 : 모든 종류의 클래스이기 때문에

operator A() const { return this->operator B(); } 
+0

암시 적 변환 처리를 두 번째 단계로 처리하는 것이 좋은 방법입니다. 'this-> '도 선택 사항이기 때문에, 곧 변환을 작성할 수 있습니다. – MvG

1

이 시도 :

operator A() const { return A(B(value)); } 

나이 : 내가 구조체 C에서이 방법을 시도 할 것

operator A() const { return A(operator B()); } 
+0

'C :: operator B()'에서 사용한 코드를 포함하고 있기 때문에 전자는 코드 중복을 나타냅니다. 그러나 후자는 장난감 예에서 잘 작동합니다. – MvG