从C ++中的私有模板类inheritance构造函数
为什么D
类编译,但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 AA::A' is inaccessible }; // within this context using BA = B<A>; class D : public BA { public: D() : BA(123) {} // OK };
我用GCC, Clang和Visual C ++进行了testing,它们都是一样的。 改变class B : private T
到public T
解决问题。 但为什么? (请注意, using T::T
是public
。)
类A
在其范围内包含注入类名称A
(即, A::A
指向类A
除非碰巧指向构造函数)。
B
类inheritance了这一点,所以B
范围内的名字A
引用了A
范围内的注入类名A
但是,由于A
是B
的私有基类,因此B
范围内的所有名称在B
是私有的。
C
类inheritance了这个,但是它不能访问这个A
,因为它在B
是私有的。 因此,错误。 请注意,该错误实际上是在构造B<A>
使用名称A
类BA
没有这个问题,因为定义B<A>
不在任何类的范围内,所以名称A
指的是全局名称A
而不是任何注入类名。 当然, BA
的名字是公开的。
您可以通过在C
限定名称A
来轻松解决此问题:
class C : public B<A> { public: C() : B<::A>( 123 ) {} };
请注意构造函数的inheritance没有效果。 问题是访问类名称A
(注入A
并在B
和C
inheritance),而不是访问构造函数。