주입 된 클래스 이름에 대해 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. 좋은 질문 – Nawaz
두 번째 절은 예제에서'X'를 언급하지 않습니까? 나는. '벡터'보다는'엑스'가 아닌 * inject-class-name * 이니? 그 경우라고 생각합니다. 따옴표는 코드와 관련이 없지만 컴파일러의 동작이 올바르지 않은 것으로 보입니다. std :: vector을 선호하는 이유가 없습니다. 벡터 '이며 이는 모호한 오류가 발생해야 함을 의미합니다. –
@David : 클래스'X'는 그렇습니다. 그러나 벡터는 두베이스 모두에 공용 이름으로 삽입됩니다 ... 따라서 첫 번째 예제에서와 마찬가지로 --X 내부에도 가시적이어야합니다 (모호합니다) –