2013-03-01 7 views
0

상황을 가정 해 봅시다.상속을 반복했습니다. Ambiguous

struct Top 
{ 
    int x; 
}; 

struct Left : public Top 
{}; 

struct Right : public Top 
{}; 

struct Bottom : public Left, public Right 
{ 
    void foo() 
    { 
    Left::x; // Normal compiled 
    } 

    void goo() 
    { 
    Left::Top::x; // error: ‘Top’ is an ambiguous base of ‘Bottom’ // Why --- ???? 
    } 
}; 

누군가가 함수 goo() 컴파일러에서 왜 모호성 오류를 표시하는지 설명 할 수 있습니까?

void foo()를 작성하여 Qualifier Left : x로 x에 액세스하면 표시됩니다. 모호성이 없으므로 더 자세한 액세스 규정자를 사용할 때 왜 Left :: Top :: x; 모호함이 나타 납니까?

+0

그런데 나는 시각적 스튜디오 2012 (기본 컴파일러 설정) 에서이 코드를 시도하고 컴파일. 하지만 gcc - 4.6 (우분투)에서는 오류가 발생합니다. 그래서 내가 gcc - 4.6 문제라고 이해하거나 ??? 모르겠어요. 누군가가 그것에 대해 뭔가를 알고 있다면 대답을 적어주세요. –

답변

0

당신의 문제는 OOP 언어에서 "다이아몬드 문제"로 알려져 있습니다. 다음을 기억하십시오 :: 무언가를 찾을 수있는 곳을 명시하고 명시 적으로 취하는 방법을 안내하지는 않습니다. 메소드 foo에서, 왼쪽에서 알 수있는 x를 참조합니다. 지금까지 오케이예요. 그러나 방법 끈적 거리기에서는, 당신의 말은 "정상에 의해 알려지는 정상 <가 알고있는 x"를 얻는다 ". 그러나이 참조는 사실을 변경하지 않으며, 당신의 클래스 Right도 클래스 Top을 알고 있습니다. 따라서 귀하의 경우, Left :: Top :: x는 Top :: x를 작성하는 것과 같습니다. 그리고 그 결과가 모호합니다. 어떤 Top의 x를 원했는지, Left가 상속 한 것이거나 Right 중 하나입니다. 물론 당신의 경우 컴파일러가 많은 문제를 일으키지 않는 단 하나의 유형입니다. 하지만 그것은 generell 규칙, 그리고 이런 것들을 신속하게 꽤 이상한 얻을 수)