C++在继承模板时无法访问父类成员问题
本文最后更新于:2021年9月23日 凌晨
单刀直入
1 |
|
在这种情况下,编译器会报错
foo()
内的x
标识符无法被找到
分析
C++
的模板中的名称会进行两次查找,称为两阶段查找(two-phase lookup)。
对于一个非依赖型名称
(不以任何方式依赖于模板参数的名称),在模板声明进行解析的时候就会进行查找
但C++
标准中规定(14.6.2 3),一个非受限的名称查找的时候将不会考虑依赖型的基类
而x
是一个非依赖型名称
,在第一阶段现场查找(此时模板父类未实例化),不会搜索父类scope
导致找不到x
标识符
进两步分析
但是在第二阶段,等模板实例化了,就能够查找父类scope,此时就能找到x
那只要想办法将其延迟到第二阶段即可
也就是将其变成依赖型名称
Solution
有两种办法:
this->x
(因为this
代表实例指针)
Base<T>::x
(明确指出搜索父类模板)
参考文献
C++在继承模板时无法访问父类成员问题
https://mrbeancpp.github.io/2021/09/23/C++在继承模板时无法访问父类成员问题/