可能重复:
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->
?
答案 0 :(得分:4)
不依赖于模板参数的名称在被定义的模板的上下文中被查找,而不知道模板参数。名称my_data
完全不依赖于模板参数。根据模板参数以某种方式命名,例如因为它们必须引用模板类的成员,所以在模板参数已知时在阶段2中查找。名称this->my_data
显然取决于模板参数,因此在阶段2中查找。这些是模板中两阶段名称查找的基本规则。
答案 1 :(得分:2)
我发现此链接可以回答您的问题。 http://stupefydeveloper.blogspot.com/2008/10/c-inheritance-from-template-class-and.html
答案 2 :(得分:1)
此行为是由[temp.dep]/3
:
在类或类模板的定义中,如果基类依赖于模板参数,则在类模板或成员的定义点或在定义期间,不会在非限定名称查找期间检查基类作用域。实例化类模板或成员。