如何为抽象基类创建模板实例化?

时间:2017-05-24 10:25:36

标签: c++ templates abstract-class

我有一个抽象类Primitive,它有一些纯粹的抽象函数。

然后我有一个带模板的树实现:

template<typename PrimitiveT>
class PrimitiveTree {
    ...
}
// explicit instantiation
template class PrimitiveTree<Project::Primitive>; // abstract
template class PrimitiveTree<SimpleTrianglePrimitive>; // implementation

在另一个文件中用作

PrimitiveTree<Primitive> *ptree;

使用此代码,我得到error C2259: 'Project::Primitive': cannot instantiate abstract class。当我删除抽象类的实例化时,我得到链接器错误,在目标文件中找不到PrimitiveTree<Primitive>的相应符号。

当与Primitive一起用作模板参数时,与头文件中的方法类似的类没有这些问题。

我如何实例化模板类,以便将必要的符号添加到目标文件中,即使模板参数是抽象类?

1 个答案:

答案 0 :(得分:1)

您需要确保模板PrimitiveTree<PrimitiveT>不依赖PrimitiveT(模板参数)是可实例化的 - 换句话说,不是抽象的。抽象类的一个属性是它无法实例化。

这意味着您的PrimitiveTree模板只能使用指针或对PrimitiveT的引用,并且绝不会以任何方式实例化实际的实例PrimitiveT。这意味着无法将PrimitiveT声明为数据成员(静态或非静态)。无法按值传递PrimitiveT。也不可能使用new表达式动态创建任何实例(例如some_pointer = new PrimitiveT[5]),因为new表达式依赖于可实例化的类型(即不是抽象的)。

使用PrimitiveT的地方必须是引用或指针。定义或声明指向或引用PrimitiveT,或将引用/指针作为函数参数传递不依赖于PrimitiveT可实例化。

如果您编写依赖于PrimitiveTree实例化的PrimitiveT的任何代码,则实现无法实例化模板。

&#34;类似的课程&#34;另一个头文件可能不依赖于Primitive可实例化,因为它遵循上述指导原则。