我有一个抽象类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
一起用作模板参数时,与头文件中的方法类似的类没有这些问题。
我如何实例化模板类,以便将必要的符号添加到目标文件中,即使模板参数是抽象类?
答案 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
可实例化,因为它遵循上述指导原则。