2012-02-10 3 views
13

후속 질문 this one.컴파일러가 템플릿 인수 목록에서 기본 클래스 생성자를 선택하는 이유는 무엇입니까?

기본적으로, 다음 코드에서 왜 컴파일러는 C 생성자에서 A<B> 내부의 BB 기본 클래스의 (액세스) 생성자를 참조하는 것이 생각합니까?

struct B{}; 

template <typename T> 
struct A : private T{}; 

struct C : public A<B>{                    
    C(A<B>); // ERROR HERE 
}; 

Live example on Ideone. 출력 : 당신이 A<B*>, A<B&> 또는 A<const B>에 생성자 인수를 변경하면 같은 오류가 팝업 것을

prog.cpp:1:9: error: 'struct B B::B' is inaccessible
prog.cpp:7:7: error: within this context

참고. 또한 MSVC10, GCC 4.7 및 Clang 3.1 ToT 중 세 개는 오류가 발생하므로 C++ 사양의 무언가 여야합니다. 무엇입니까?

+0

정확히 같은 주제를 만든 이유를 모르겠습니다. 당신은 더 나은 것을 만들기 위해 그 주제를 편집 할 수있었습니다. – Nawaz

+3

@Nawaz : 근본적으로 다른 질문입니다. 나는 "왜"를 묻는다, 다른 질문은 "무엇을해야하는지"묻는다. – Xeo

+0

남자, 나는 이것을 클래스 A : private NotCopyable (클래스 B : private NotCopyable {}};)로 두 번 이상 물 렸습니다. 글로벌 범위를보기 전에 클래스 범위에서 심볼을 찾습니다. –

답변

15

표준을 사용하면 주입 된 클래스 이름에 원래 이름보다 액세스하기가 어려워집니다. 이는도 함께 예제, §11.1/5 메모에 언급 :

자격이 A 액세스

[ Note: In a derived class, the lookup of a base class name will find the injected-class-name instead of the name of the base class in the scope in which it was declared. The injected-class-name might be less accessible than the name of the base class in the scope in which it was declared. —end note ]

[ Example:

class A { }; 
class B : private A { }; 
class C : public B { 
    A *p; // error: injected-class-name A is inaccessible 
    ::A *q; // OK 
}; 

end example ]

는 개인 상속에서 오기 때문에 액세스 할 수 없습니다 주입 된 이름을 사용합니다. A 규정에 액세스하면 전역 범위에서 액세스 할 수있는 선언 된 이름을 사용합니다.

관련 문제