使用模板实现派生类

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&lt;T&gt;是类模板B的基类:

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

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

我发现如果 A 没有模板化,代码编译得很好

在这种情况下,基类不依赖于模板参数,所以在基类中进行x的查找,从B中找到成员x即使你不表达它是this-&gt;xA::x

【讨论】:

以上是关于使用模板实现派生类的主要内容,如果未能解决你的问题,请参考以下文章

C++ 派生模板类:访问实例的受保护成员

如何使用 C++ 中的模板编程从基类创建派生类?

从具体类派生抽象模板类

具有 std::array 大小类型的派生模板类

如何使用 Boost.serialize 序列化派生模板类?

对基类成员数据的派生模板类访问