首页 > 解决方案 > 使用模板实现派生类

问题描述

我有一个模板化的基类A和模板化的派生类B定义,headers.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>;

标签: c++templatesinheritance

解决方案


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

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

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

虽然成员xfromA<T>实际上是从 in 继承的B,但在 in 中找不到它,B因为在x内部使用时B,不会在其基类中查找该名称A<T>。原因是在依赖模板参数的基类中默认不执行名称查找(基类A<T>依赖于 的模板参数B,即T)。对于要从x​​中查找的名称,您需要将其表示为或。A<T>Bthis->xA<T>::x

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

在这种情况下,基类不依赖于模板参数,因此x在基类中进行查找,即使您不将其表示为or ,也x可以从中找到成员。Bthis->xA::x


推荐阅读