D
클래스가 컴파일 되나 클래스가 C
인 이유는 무엇입니까? C++의 개인 템플릿 클래스에서 생성자 상속
class A
{
public:
A(int) {}
};
template <class T>
class B : private T // Note: private base class
{
public:
using T::T;
};
class C : public B<A>
{
public:
C() : B<A>(123) {} // Error: 'class A A::A' is inaccessible
}; // within this context
using BA = B<A>;
class D : public BA
{
public:
D() : BA(123) {} // OK
};
나는 GCC,
Clang 및 Visual C++ 테스트, 그들은 모두 동일합니다.
class B : private T
을
public T
으로 변경하면 문제가 해결됩니다. 하지만 왜? 합니다 (
using T::T
가
public
유의).
핫스팟을 첨부하기 위해 "템플릿"태그를 추가했습니다. 저에게 "태그 스패밍"에 대한 비판을 보내주십시오. – Bathsheba
'B (123)'을'B (123)'로 바꾸면'C'템플릿을 만들고 모든 곳에서'B'을 사용하면 컴파일됩니다. –
Holt
그것은 템플릿 태그를 정당화 할 것이고 실제로 클래스 템플릿에서 이름 검색은 미묘하게 다릅니다. – MSalters