C++在继承模板时无法访问父类成员问题

本文最后更新于:2021年9月23日 凌晨

单刀直入

1
2
3
4
5
6
7
8
9
template<typename T>
struct B {
int x;
};

template<typename T>
struct X : B<T> {
void foo() { x = 0; }
};

在这种情况下,编译器会报错

foo()内的x标识符无法被找到

分析

C++的模板中的名称会进行两次查找,称为两阶段查找(two-phase lookup)。

对于一个非依赖型名称(不以任何方式依赖于模板参数的名称),在模板声明进行解析的时候就会进行查找

C++标准中规定(14.6.2 3),一个非受限的名称查找的时候将不会考虑依赖型的基类

x是一个非依赖型名称,在第一阶段现场查找(此时模板父类未实例化),不会搜索父类scope

导致找不到x标识符

进两步分析

但是在第二阶段,等模板实例化了,就能够查找父类scope,此时就能找到x

那只要想办法将其延迟到第二阶段即可

也就是将其变成依赖型名称

Solution

有两种办法:

this->x (因为this代表实例指针)

Base<T>::x (明确指出搜索父类模板)

参考文献

c++模板类在继承中子类无法访问父类的成员_小源的博客-CSDN博客

如何理解 模板类继承模板类, 子类看不到父类成员? - 知乎


C++在继承模板时无法访问父类成员问题
https://mrbeancpp.github.io/2021/09/23/C++在继承模板时无法访问父类成员问题/
作者
MrBeanC
发布于
2021年9月23日
许可协议