使用模板实现派生类

Implementing derived class with templates

本文关键字:派生 实现      更新时间:2023-10-16

我有一个模板化基类A和模板化派生类Bheaders.h中定义,实现转到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>;

下面的代码无法编译,因为x不在B范围内

A<T>是类模板的基类B

template<typename T>
class B: public A<T> {
// ...
};

虽然从A<T>x的成员实际上是在B中继承的,但它在B中找不到,因为当在B中使用名称x时,不会在其基类A<T>中查找。原因是默认情况下,在依赖于模板参数的基类中不执行名称查找(基类A<T>取决于B的模板参数,即T(。要从BA<T>中查找名称x,您需要将其表示为this->xA<T>::x

我发现如果A不是模板化的,代码可以很好地编译

在这种情况下,基类不依赖于模板参数,因此x的查找是在基类中执行的,并且即使您不将其表示为this->xA::x,也可以从B中找到成员x

相关文章: