用模板实现派生类

时间:2020-05-27 10:16:26

标签: c++ templates inheritance

我在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>;

1 个答案:

答案 0 :(得分:2)

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

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

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

尽管x中的成员A<T>实际上是在B中继承的,但在B中却找不到它,因为名称x在{ {1}}不在其基类B中查找。原因是默认情况下,在不依赖模板参数的基类中不执行名称查找(基类A<T>依赖于A<T>的模板参数,即B)。要在T的{​​{1}}中查找名称x,您需要将其表示为A<T>B

我发现,如果未将this->x用作模板,则代码可以正常编译

在这种情况下,基类不依赖于模板参数,因此在基类中执行A<T>::x的查找,甚至从A中找到成员x如果您不将其表示为xB

相关问题