C++ 用模板实现派生类

C++ 用模板实现派生类,c++,templates,inheritance,C++,Templates,Inheritance,我在headers.h中定义了一个模板基类a和模板派生类B,实现转到source.cpp 以下代码不编译,因为x不在B的范围内。问题是我做错了什么?我发现,如果A没有模板化,那么代码可以编译得很好(有相关的更改) //headers.h 模板 甲级 { 公众: tx; } 模板 B类:公共A { void foo();//用x做点什么 } //source.cpp #包括标题 模板 void B::foo(){}//用x做点什么 //显式实例化 模板B类; 由于x不在B A是类模板B的基类:

我在
headers.h
中定义了一个模板基类
a
和模板派生类
B
,实现转到
source.cpp

以下代码不编译,因为
x
不在
B
的范围内。问题是我做错了什么?我发现,如果
A
没有模板化,那么代码可以编译得很好(有相关的更改)

//headers.h
模板
甲级
{
公众:
tx;
}
模板
B类:公共A
{
void foo();//用x做点什么
}
//source.cpp
#包括标题
模板
void B::foo(){}//用x做点什么
//显式实例化
模板B类;
由于
x
不在
B

A
是类模板
B
的基类:

template<typename T>
class B: public A<T> {
// ...
};
模板
B类:公共A{
// ...
};
虽然
A
中的成员
x
实际上是在
B
中继承的,但在
B
中找不到它,因为在
B
中使用
x
名称时,不会在其基类
A
中查找。原因是默认情况下,不在依赖于模板参数的基类中执行名称查找(基类
A
依赖于
B
的模板参数,即
T
)。要在
B
A
中查找名称
x
,需要将其表示为
this->x
A::x

我发现如果
A
没有模板化,代码编译就可以了

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

// source.cpp
#include headers.h

template <typename T>
void B<T>::foo() {}    // do something with x

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