在类定义中 B 是可以的。也就是所谓的注入类名。
这也指模板(不包括依赖碱基)。例如
template <class T> class B{};
template <class T> class C: public B<int>
{
void f(B* p) {} //same as B<int>* p
void f(C* p) {} //same as C<T>* p
};
一般来说,基类(和类本身)可以在类定义中被引用,而无需限定或模板参数。
引用标准:
9.2 : 在看到类名后立即将类名插入到声明它的范围内。类名也被插入到类本身的范围内;这被称为注入类名。出于访问检查的目的,注入的类名被视为公共成员名。
从这个定义可以看出,类本身的名称可以从该类公开访问,因此在派生类中可用。这证明了我关于 B 和 N::B 都可以的观点,因为名称 B 是继承的
顺便说一句,这也解释了为什么以下内容无效:
template <class T> class B{};
template <class T> class C: public B<T>
{
void f(B* p){} //ERROR
// the above is invalid!! Base class is dependent therefore
//its scope is not considered during unqualified name lookup
void g(typename C::B* p){} //this is valid, same as B<T>* p
};
14.6.1 谈到模板中注入的类名。在这里粘贴太长了。Hth