2012-03-05 3 views
4

동일한 var 이름 ('aa')과 두 번째 구조 ('CCC')가 포함 된 두 개의 구조체 ('AAA'와 'BBB')는 다중 상속을 통해 모두 정의됩니다. [두 구조는 서로 관련이 없으므로 두 클래스가 공통 조상을 가지고있을 때 유명한 다이아몬드 문제가 아닙니다.] 파생 된 구조체 'CCC'에 대해 파생 된 구조체 'AAA'에서 var와 함께 작동하도록 명시 적으로 시도했지만 gcc는 여전히 모호한 def에 대해 불평합니다. 왜?gcc의 'using'키워드

struct AAA { int aa; }; 
struct BBB { int aa; }; 
struct CCC : public AAA , public BBB { using AAA::aa; }; 
int main() { CCC ccc; return ccc.aa; } 

는 제공 : AA이 그 범위에 이미 있기 때문에

x.cpp: In function 'int main()': 
x.cpp:4:34: error: request for member 'aa' is ambiguous 
x.cpp:2:18: error: candidates are: int BBB::aa 
x.cpp:1:18: error:     int AAA::aa 
+0

저는 개인적으로 _ 충돌하지 않는 이름을 사용하고 있습니다. 또는,이 경우 약간 재미있어 보이지만 범위가 명확한 범위 분석 연산자를 사용하십시오 :'ccc.AAA :: aa'. – Damon

답변

5

그것은 실패합니다. using AAA.aa은 다시 범위로 가져올 것입니다.

이 유형으로 캐스팅하고 그런 식으로 추출 할 수 있습니다.

#include <iostream> 
struct AAA { 
    int aa; 
    AAA() : aa(1) {} 
    virtual ~AAA(){}; 
}; 
struct BBB { 
    int aa; 
    BBB() : aa(5) {} 
    virtual ~BBB(){}; 
}; 

struct CCC : public AAA , public BBB 
{ 
    CCC() : AAA(), BBB() {} 
// using AAA::aa; 
}; 

int main() 
{ 
    CCC ccc; 
    std::cout << static_cast<BBB*>(&ccc)->aa << std::endl; 
} 

비록 이것이 somehting이라면 많은 것을하려는 의도는 그 기능을 캡슐화하기 쉽습니다.

//member of CCC 
int get_aa() 
{ 
    return static_cast<BBB*>(this)->aa; 
} 
+0

함수 또는 캐스트를 사용하면 (실제로는 작동하지 않습니다.) –

+0

을 사용하면 정상적으로 작동합니다. using은 현재 범위/네임 스페이스에 멤버를 가져옵니다. BBB와 AAA 둘 다 이미 CCC에 있으며, using 명령은 컴파일러가 작동하도록 기본값을 선택하지 않습니다. – 111111

+0

그냥 (var 대신) 공유 함수로 시도하고 'using'이 작업을 수행하는 것 같습니다. 또한 - Visual C++에서 변수로 잘 작동합니다. –

0

당신은 관련 회원에 대한 포인터를 설정할 수 있습니다 당신은 Virtual inheritance을 사용할 수 있습니다

struct AAA { int aa; }; 
struct BBB { int aa; }; 
struct CCC : public AAA , public BBB { 
    int *A_aa; int *B_aa; 
    CCC(): 
      A_aa(&static_cast<AAA*>(this)->aa), 
      B_aa(&static_cast<BBB*>(this)->aa) { } 
}; 

int main() { CCC ccc; return *ccc.A_aa; } 
+0

저는 개인적으로이 방법에 대해 조언 할 것이므로 매우 관용적이지는 않습니다. 또한 가능한 경우 포인터보다는 참조를 사용하는 것이 좋습니다. – 111111

0

. 예를 들어,이 코드는 다음과 같이 다시 써야합니다.

struct AAA { int aa; }; 
struct BBB { int aa; }; 
struct CCC : virtual public AAA , virtual public BBB { using AAA::aa; };