使用模板实现派生类
Implementing derived class with templates
我有一个模板化基类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>;
下面的代码无法编译,因为
x
不在B
范围内
A<T>
是类模板的基类B
:
template<typename T>
class B: public A<T> {
// ...
};
虽然从A<T>
x
的成员实际上是在B
中继承的,但它在B
中找不到,因为当在B
中使用名称x
时,不会在其基类A<T>
中查找。原因是默认情况下,在依赖于模板参数的基类中不执行名称查找(基类A<T>
取决于B
的模板参数,即T
(。要从B
A<T>
中查找名称x
,您需要将其表示为this->x
或A<T>::x
。
我发现如果
A
不是模板化的,代码可以很好地编译
在这种情况下,基类不依赖于模板参数,因此x
的查找是在基类中执行的,并且即使您不将其表示为this->x
或A::x
,也可以从B
中找到成员x
。
相关文章:
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 如何在从抽象基派生的类中实现相同的方法?
- 对派生自同一基类的类实现冲突检查
- 使用模板实现派生类
- 如何为具有私有成员的派生类实现移动构造函数
- 关于C++从派生类调用在基类中实现的虚拟函数的问题
- 如何在基类中定义静态接口,并确保该接口必须在派生类中实现
- 如何在派生类上强制实现特定数据类型的构造函数?
- C++派生类中的纯虚函数实现
- C :在f的派生类实现中,可以用x的子类型代替纯虚拟函数f的参数x
- 确保派生的类实现至少是来自抽象类(C )的两种方法之一
- C 结构实现派生接口
- 两个子级具有相同的 F() 实现,另外两个子级具有不同的 F 实现,所有四个子级都派生自同一类
- 如何在C++中正确表达具有相同实现的两个派生类函数?
- 如果不在派生类实现中执行此操作,"basic_streambuf"是否会创建自己的获取/放置区域?
- 如果未实现虚函数,则大多数派生类无法编译,但如果一个基类未实现虚函数,则可以编译
- 从基类(车辆)继承方法,从派生类(汽车)继承值,以使用 C++ 在另一个派生类(车道)中实现
- 没有实现文件(.cpp)的派生类
- C++通过映射并使用中的方法从基类实现派生类