C++模板子类访问父类成员变量报错,求原因与正确用法
问题原因与解决方案
问题根源
这是C++模板继承中的依赖基类名称查找规则导致的问题:
- 父类
CCircularBuffer<T, Alloc>是依赖于模板参数的基类(基类类型由子类的模板参数决定)。 - 编译子类成员函数时,编译器不会自动去依赖基类中查找未加限定的名称(比如
values_、alloc_),它无法确定这些名称的来源,因此报“未声明标识符”错误。
你的继承写法本身是正确的,问题不在继承关系,而是模板名称查找的特殊规则。
两种解决方法
方法1:用this->前缀指明成员来自当前对象的基类
修改子类的resize实现:
template<typename T, typename Alloc> void CCircularBufferExt<T, Alloc>::resize(size_t n) { this->values_ = this->alloc_.allocate(n); }
this->会告诉编译器去当前对象的依赖基类中查找这些成员名称。
方法2:用父类模板名显式限定
直接通过父类完整模板名称访问成员:
template<typename T, typename Alloc> void CCircularBufferExt<T, Alloc>::resize(size_t n) { CCircularBuffer<T, Alloc>::values_ = CCircularBuffer<T, Alloc>::alloc_.allocate(n); }
这种方式直接指定成员所属类,能让编译器准确定位到目标成员。
内容的提问来源于stack exchange,提问作者teddy_bear
相关产品推荐
相关产品推荐

