1

다음 코드 :C++ 다중 상속 개인 회원 ambigious 액세스

class A1 { 
public: 
    int x; 
}; 
class A2 { 
private: 
    int x() { return 67; } 
}; 

class M : public A1, public A2 {}; 

int main() { 
    M m; 
    m.x; 
} 

오류로 컴파일 :

error C2385: ambiguous access of 'x' 
note: could be the 'x' in base 'A1' 
note: or could be the 'x' in base 'A2' 

하지만 왜? A1::x만이 M에 표시되어야합니다. A2::x은 순전히 로컬이어야합니다.

+1

는, * 이름 조회 * 전에 * 멤버 액세스 확인 *이 수행 발생합니다. – WhiZTiM

+0

질문이 이전에 질문되었습니다 : http://stackoverflow.com/questions/6397938/ambiguous-access –

답변

3

member access checking이 수행되기 전에 C++에서 name-lookup이 발생합니다. 따라서 이름 조회 (귀하의 경우 Unqualified)는 두 개의 이름을 찾습니다.

당신은 명확하게 자격을 갖춘 이름을 사용할 수 있습니다 :

C++에서
int main() { 
    M m; 
    m.A1::x;  //qualifed name-lookup 
} 
+0

@ tower120, no. 이것은 ADL과 관련이 없습니다. [Koenig Lookup] (http://en.cppreference.com/w/cpp/language/adl)은 비회원 기능에 대한 비 일치 조회를 수행 할 때 사용됩니다. – WhiZTiM

+0

그건 그렇고, 이것은 역사적인 것입니까? 디자인 (무언가를 위해)? 나에게는 처음에는 컴파일러 버그처럼 보였지만 이제는 언어 버그처럼 보인다. :) – tower120

+1

아니요, 언어 버그가 아닙니다. 예상 액세스 제어가 이름 조회에 영향을주는 것은 문제입니다. 액세스 제어가 이름 검색에 영향을 미쳤다면 (예를 들어 어떤 일치가 수용 가능했는지를 변경 한 경우) 단순히 '개인'을 '공개'또는 '공개'로 변경하여 예기치 않은 방식으로 작업 코드의 동작을 크게 변경하는 것이 쉽습니다 (의도적으로 또는 악의적으로). 그 반대의 경우도 마찬가지입니다. 작은 변화에도 불구하고 깨지기 쉬운 코드를 갖는 것보다 프로그래머에게 모호함을 알리는 것이 더 좋습니다 (사용자에게 일어난 것처럼). – Peter