【发布时间】:2016-12-30 07:49:55
【问题描述】:
为什么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 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。)
【问题讨论】:
-
我已经添加了“模板”标签来吸引热点。请将任何对“标签垃圾邮件”的批评指向我。
-
如果你用
B(123)替换B<A>(123),它会编译,如果你把C模板化并在任何地方使用B<T>,它也会编译。 -
这可以证明模板标签的合理性,并且确实在类模板中查找名称略有不同。
标签: c++ templates language-lawyer