首页 >后端开发 >C++ >为什么 C 语言的派生模板类中的基类标识符不可访问?

为什么 C 语言的派生模板类中的基类标识符不可访问?

Linda Hamilton
Linda Hamilton原创
2024-11-19 00:10:02407浏览

Why Are Base Class Identifiers Inaccessible in Derived Template Classes in C  ?

派生模板类中标识符的可见性有限

在 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::NO_ZEROFILL,显式指示编译器在基类中查找标识符,即使 T 的具体类型不是在此阶段已知。

因此,在派生模板类中,基模板类中定义的标识符只能通过显式限定来访问,从而确保模板在运行时正确解析用特定类型实例化。

以上是为什么 C 语言的派生模板类中的基类标识符不可访问?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn