C++模板派生类重写模板基类虚函数时成员变量未定义问题
问题原因
该报错由C++模板的两阶段名称查找规则导致:当派生类为模板类,且继承自依赖模板参数的基类(此处Base<DATATYPE, VALUE>的实际类型随派生类的模板参数变化,属于依赖型基类)时,编译器在第一阶段解析派生类代码时,不会进入依赖型基类的作用域查找非限定名称,因此直接写variable1会被判定为未定义。
而你将派生类改为非模板类时,基类是固定的确定类型,编译器会直接到基类作用域查找名称,因此不会触发该报错。
解决方案
共有三种常用的修复方式,都不需要修改模板参数定义,可满足你的需求:
- 方案1:访问基类成员时增加
this指针前缀,让编译器推迟到模板实例化的第二阶段再解析名称,是最常用的方案
调整后clear函数代码如下:void clear() { int testVar = this->variable1; } - 方案2:在派生类作用域中提前引入基类的成员名称
在Derived类的定义中增加using声明:template <class DATATYPE=short, short VALUE = 100> class Derived : public Base<DATATYPE, VALUE> { // 引入基类成员名称 using Base<DATATYPE, VALUE>::variable1; public: Derived(); void clear() { int testVar = variable1; } }; - 方案3:访问时显式指定基类作用域
void clear() { int testVar = Base<DATATYPE, VALUE>::variable1; }
额外提示:你提供的示例代码中,
Base和Derived类的定义末尾都缺少了类定义必需的分号,实际编译时也可能触发语法错误,建议补充。
内容的提问来源于stack exchange,提问作者eboone20053
相关产品推荐
相关产品推荐

