为什么我不能从C++中的模板化超类中独立出来?

Why can't I inhert from a templated superclass in C++?

本文关键字:超类 独立 不能 C++ 为什么      更新时间:2023-10-16

可能重复:
基模板类数据成员在派生模板类中不可见?

我正在尝试创建一个模板化类,它扩展了一个模板超级类。

template <class T>
class SuperClass {
public:
        T my_data;
};
template <typename T2>
class SubClass : public SuperClass<T2>
{
public:
        T2 f() { return my_data; }
};
int main()
{
        SubClass<int> x;
        return 0;
}

然而,我得到了以下错误(使用g++4.6.1):

test.cpp:11:18: error: ‘my_data’ was not declared in this scope

奇怪的是,如果我按如下方式重新定义SubClass::f(),它会起作用:

T2 f() { return this->my_data; }

有人理解我为什么需要this->吗?

不依赖于模板参数的名称在不知道模板参数的情况下,会在定义的模板上下文中查找。名称my_data根本不依赖于模板参数。名称在某种程度上取决于模板参数,例如,因为它们必须引用模板类的成员,所以在第2阶段,当模板参数已知时,会查找这些名称。名称this->my_data显然取决于模板参数,因此在第2阶段中可以查找到。以下是在模板中进行两阶段名称查找的基本规则。

这种行为是由于[temp.dep]/3:

在类或类模板的定义中,如果基类依赖于模板参数,则在类模板或成员的定义点或类模板或组件的实例化期间,在不合格名称查找期间,不检查基类作用域。