为什么我不能继承C ++中模板化的超类?

时间:2012-03-20 07:09:00

标签: c++ templates inheritance

  

可能重复:
  Base template class data members are not visible in derived template class?

我正在尝试创建一个模板化的类来扩展模板化的超类。

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->

3 个答案:

答案 0 :(得分:4)

不依赖于模板参数的名称在被定义的模板的上下文中被查找,而不知道模板参数。名称my_data完全不依赖于模板参数。根据模板参数以某种方式命名,例如因为它们必须引用模板类的成员,所以在模板参数已知时在阶段2中查找。名称this->my_data显然取决于模板参数,因此在阶段2中查找。这些是模板中两阶段名称查找的基本规则。

答案 1 :(得分:2)

答案 2 :(得分:1)

此行为是由[temp.dep]/3

引起的
  

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