为什么我不能从C++中的模板化超类中独立出来?
Why can't I inhert from a templated superclass in C++?
可能重复:
基模板类数据成员在派生模板类中不可见?
我正在尝试创建一个模板化类,它扩展了一个模板超级类。
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
:
在类或类模板的定义中,如果基类依赖于模板参数,则在类模板或成员的定义点或类模板或组件的实例化期间,在不合格名称查找期间,不检查基类作用域。
相关文章:
- 模板转换为超类
- 我的超类中的模板问题与结构定义
- 创建子类的多个实例,其中只有一个超类实例
- 给定一个指向对象的超类指针,如何获取对象的大小?
- 重写另一个方法 [C++] 使用的超类回调函数
- 用初始化列表和超类构造函数声明子类构造函数的正确方式
- 我们可以在没有新实例化的情况下声明一个抽象方法来返回抽象超类中的子类对象吗
- C++为API中定义的结构创建超类
- 使用派生类C++方法的超类
- 确保指向超类的指针指向c++中某个子类的对象
- 如何将超类的受保护成员访问到其派生类. 如果已在派生类中声明了具有相同名称的函数?
- 在从给定超类继承的所有类上调用虚函数
- 如何使 Swig 发出C++超类
- 如何根据构造函数参数使用超类类型初始化成员变量?
- C++:从类型索引中获取超类类型索引
- 为什么编译器找不到超类的方法?
- 无法使用子类变量访问超类公共成员
- 如何将项目放入具有模板化超类类型的向量中
- 如何高效/正确地存储等距游戏的不同类(单个超类的所有子类型)的地图?
- 为什么我不能从C++中的模板化超类中独立出来?