派生模板类中标识符的可见性有限
在 C 中,模板类在继承中引入了一个独特的方面:在基模板类中定义的标识符对于派生模板类可能不可见。这种行为称为两阶段查找,是由于模板实例化和编译涉及的不同阶段而产生的。
考虑以下示例:
template <typename T> class Base { public: static const bool ZEROFILL = true; static const bool NO_ZEROFILL = false; }; template <typename T> class Derived : public Base<T> { public: Derived(bool initZero = NO_ZEROFILL); // NO_ZEROFILL is not visible ~Derived(); };
编译此代码时,GCC g 3.4.4 (cygwin) 产生错误,因为 Derived 无法从其基类 Base 访问 NO_ZEROFILL。这是因为在模板实例化的第一阶段,编译器解析代码时,并没有为T分配具体的类型,因此无法确定Derived继承的具体Base类,因此无法解析定义的标识符在基类中。
为了克服此限制,在访问派生模板类中的基类标识符时需要显式限定。下面的代码解决了这个问题:
template <typename T> class Derived : public Base<T> { public: Derived(bool initZero = Base<T>::NO_ZEROFILL); // Explicit qualification ~Derived(); };
通过使用 Base
因此,在派生模板类中,基模板类中定义的标识符只能通过显式限定来访问,从而确保模板在运行时正确解析用特定类型实例化。
以上是为什么 C 语言的派生模板类中的基类标识符不可访问?的详细内容。更多信息请关注PHP中文网其他相关文章!