C++模板派生类访问基类protected成员提示不在作用域的原因
问题原因
这是C++模板的两阶段名称查找规则导致的,具体逻辑如下:
- 子类
test2<dt>继承的基类test1<dt>是依赖模板参数dt的依赖型基类 - C++对模板类做名称查找时,第一阶段(模板定义阶段,还未实例化具体参数类型)只会在非依赖上下文里搜索名称,不会进入依赖型基类的作用域查找未限定的名称
x,因此编译器会直接判定x未声明 - 非模板类继承不会出现这个问题,因为非模板类的基类是固定类型,编译时可以直接检索到基类成员,不需要等到实例化阶段
解决方案
任选以下任意一种方式修正即可:
- 访问成员时加
this->前缀,显式告诉编译器x是当前类的成员,延后到实例化阶段再查找:
// 修改SetVals和GetVals内的x访问逻辑 this->x = xarg; cout << this->x << endl;
- 显式指定
x所属的基类作用域:
test1<dt>::x = xarg; cout << test1<dt>::x << endl;
- 在子类作用域提前声明要使用基类的
x成员,后续代码不需要再修改访问逻辑:
template<class dt> class test2:public test1<dt> { using test1<dt>::x; // 新增该声明 public: void SetVals(int xarg) { x = xarg; } void GetVals() { cout<<x<<endl; } };
内容的提问来源于stack exchange,提问作者Sagar Tube
相关产品推荐
相关产品推荐

