首页 >后端开发 >C++ >为什么基模板类的静态成员在派生类中不可访问?

为什么基模板类的静态成员在派生类中不可访问?

Patricia Arquette
Patricia Arquette原创
2024-11-18 00:34:02646浏览

Why are Static Members of Base Template Classes Inaccessible in Derived Classes?

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

考虑以下代码片段:

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) 编译,此代码编译失败,因为NO_ZEROFILL 对于 Derived 模板类不可见。此行为可以归因于 C 中的两阶段查找。

C 中的两阶段查找

当编译器遇到模板声明时,它只执行初步的查找该模板中使用的标识符。由于此阶段尚未确定 T 的实际类型,因此编译器无法解析依赖于此类型的标识符,例如 Base::NO_ZEROFILL.

两阶段查找过程中:

  1. 初步查找: 在当前范围内和先前声明的命名空间中搜索标识符。
  2. 模板实例化: 使用特定类型参数实例化模板后,将执行第二次查找找到实例化的成员和标识符。

在这种情况下, NO_ZEROFILL 在初步查找期间不可见,因为它取决于未知类型 T。因此,您必须在派生类中显式指定 Base::NO_ZEROFILLthis->NO_ZEROFILL 以指示它是基类的成员,其类型在模板实例化时确定。

以上是为什么基模板类的静态成员在派生类中不可访问?的详细内容。更多信息请关注PHP中文网其他相关文章!

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