使用模板实现派生类
Posted
技术标签:
【中文标题】使用模板实现派生类【英文标题】:Implementing derived class with templates 【发布时间】:2020-05-27 10:16:26 【问题描述】:我在headers.h
中定义了一个模板化基类A
和模板化派生类B
,实现转到source.cpp
以下代码无法编译,因为x
不在B
的范围内。问题是我做错了什么?我发现如果 A
没有模板化,代码编译得很好(有相关的更改)。
// headers.h
template <typename T>
class A
public:
T x;
template <typename T>
class B : public A<T>
void foo(); // do something with x
// source.cpp
#include headers.h
template <typename T>
void B<T>::foo() // do something with x
// explicit instantiation
template class B<double>;
【问题讨论】:
【参考方案1】:以下代码无法编译,因为
x
不在B
的范围内
A<T>
是类模板B
的基类:
template<typename T>
class B: public A<T>
// ...
;
虽然 A<T>
中的成员 x
实际上是在 B
中继承的,但在 B
中找不到它,因为名称 x
在 B
中使用时不会在其基数中查找类A<T>
。原因是在依赖模板参数的基类中默认不执行名称查找(基类A<T>
依赖于B
的模板参数,即T
)。要在A<T>
中从B
查找名称x
,您需要将其表示为this->x
或A<T>::x
。
我发现如果
A
没有模板化,代码编译得很好
在这种情况下,基类不依赖于模板参数,所以在基类中进行x
的查找,从B
中找到成员x
即使你不表达它是this->x
或A::x
。
【讨论】:
以上是关于使用模板实现派生类的主要内容,如果未能解决你的问题,请参考以下文章