2011-08-11 7 views
19

주입 된 클래스 이름에 대해 C++ 표준에서 읽은 내용은 샘플 프로그램의 동작과 모순됩니다. 또한 대한 그 클래스의 멤버 로 간주됩니다모호한 삽입 클래스 이름이 오류가 아닙니다.

3.4에서
  • (제 3 항)

    클래스의 주입 - 클래스 이름 (9 절)을 : 여기에 내가 읽은거야 이름 숨기기 및 조회 목적.

    (9)로부터
  • (제 2 항)

    , 클래스 이름이 클래스 이름 본 직후 선언되는 범위 내로 삽입된다. class-name은 클래스 자체의 범위에 삽입 된 입니다. 이를 injection-class-name이라고합니다. 액세스 확인을 위해 injection-class-name은 공개 멤버 이름 인 것처럼 처리됩니다. 이러한에서

나는 다음을 잘 형성 번역 단위이며, 성공적으로 컴파일을 이해합니다.

#include <vector> 
class X: std::vector<int> 
{ 
    vector mem; 
}; 

그러나, 나는 다음과 같은 오류를 생산해야한다고 생각,하지만 이름 vector과 같이 모두 std::vector<int>std::vector<char>에 주입되기 때문에이

#include <vector> 
class X: std::vector<int>, std::vector<char> 
{ 
    vector mem; //compiles OK... mem is apparently std::vector<int> 
}; 

을하지 않습니다 공공 회원 마치 이름을 사용하는 경우 X에 상속되어야하므로 에있는 vector 이름은 모호해야합니다. 내가 놓친 게 있니?

P. MSVC9.0을 사용 중입니다.

+1

+1. 좋은 질문 – Nawaz

+0

두 번째 절은 예제에서'X'를 언급하지 않습니까? 나는. '벡터'보다는'엑스'가 아닌 * inject-class-name * 이니? 그 경우라고 생각합니다. 따옴표는 코드와 관련이 없지만 컴파일러의 동작이 올바르지 않은 것으로 보입니다. std :: vector 을 선호하는 이유가 없습니다. 벡터 '이며 이는 모호한 오류가 발생해야 함을 의미합니다. –

+1

@David : 클래스'X'는 그렇습니다. 그러나 벡터는 두베이스 모두에 공용 이름으로 삽입됩니다 ... 따라서 첫 번째 예제에서와 마찬가지로 --X 내부에도 가시적이어야합니다 (모호합니다) –

답변

15

내가 그것을 발견! 바로 표준 안에 있습니다! 내가 맞았 어! 이 모호해야합니다!

절 14.6.1 단락

주입 된 클래스 이름 (10.2) (특정한 경우에 모호함이 발생할 수 찾는 룩업 예를 들면, 하나 이상의 발견되면 기본 클래스). 에있는 모든 주입 된 클래스 이름이 동일한 클래스 템플릿의 전문화를 참조하고 다음에 template-argument-list가 오는 경우 참조는 클래스 템플릿 자체를 의미하며 전문화는 참조하지 않습니다. 그것들은 모호하지 않다.[실시 예 :

template <class T> struct Base { }; 
template <class T> struct Derived: Base<int>, Base<char> 
{ 
    typename Derived::Base b; // error: ambiguous typename 
    Derived::Base<double> d; // OK 
}; 

-end 예]

결론 :이 다른 마이크로 소프트 컴파일러 버그이다. 언어 확장을 사용 중지해도 도움이되지 않습니다.

4

아니요, 누락 된 것이 없으며 컴파일러가 버그가있는 것처럼 보입니다. 당신은 GCC는 여기를 처리하는 방법을 볼 수 있습니다 http://ideone.com/MI9gz

그것의 오류 메시지는 다음과 같습니다

prog.cpp:4:4: error: reference to 'vector' is ambiguous 
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/stl_vector.h:171:5: error: candidates are: class std::vector<char> std::vector<char>::vector 
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/stl_vector.h:171:5: error:     class std::vector<int> std::vector<int>::vector 
+0

아, 그래, 정말로! 방금 표준에서 인용문을 찾았습니다 (내 대답 참조). –