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> {
// ...
};