如何使用具有模板规范的 class 继承模板摘要 class
How to inherit template abstract class with a class with template secification
我在 linux 上有一个构建到静态库中的项目,然后我想将其包含在单元测试项目和应用程序项目中。
在这个库中,我有类似的东西:
template<class T> class A
{
public:
virtual T doStuff() = 0;
virtual void doOther(T a) = 0;
protected:
A() { ... }
};
class B : public A<int>
{
public:
B() { ... }
virtual int doStuff() { ... }
virtual void doOther(int a) { ... }
};
我的库中出现编译错误:undefined reference to A<int>::A()
。
我猜它与模板生成有关,我也可以像这样重写虚函数吗?
模板是在编译期间生成的,需要在原型化的同一翻译单元中实现。因此,如果您要包括模板化的声明 class,您还需要包括定义。
因此,将声明和定义都放在同一个头文件中是明智的,这样,任何打算使用它的模块在编译时都可以根据需要生成定义。
参考:
14.7.2 显式实例化[temp.explicit]
For a given set of template arguments, if an explicit instantiation of
a template appears after a declaration of an explicit specialization
for that template, the explicit instantiation has no effect.
Otherwise, for an explicit instantiation definition the definition of
a function template, a member function template, or a member function
or static data member of a class template shall be present in every
translation unit in which it is explicitly instantiated.
我在 linux 上有一个构建到静态库中的项目,然后我想将其包含在单元测试项目和应用程序项目中。
在这个库中,我有类似的东西:
template<class T> class A
{
public:
virtual T doStuff() = 0;
virtual void doOther(T a) = 0;
protected:
A() { ... }
};
class B : public A<int>
{
public:
B() { ... }
virtual int doStuff() { ... }
virtual void doOther(int a) { ... }
};
我的库中出现编译错误:undefined reference to A<int>::A()
。
我猜它与模板生成有关,我也可以像这样重写虚函数吗?
模板是在编译期间生成的,需要在原型化的同一翻译单元中实现。因此,如果您要包括模板化的声明 class,您还需要包括定义。
因此,将声明和定义都放在同一个头文件中是明智的,这样,任何打算使用它的模块在编译时都可以根据需要生成定义。
参考:
14.7.2 显式实例化[temp.explicit]
For a given set of template arguments, if an explicit instantiation of a template appears after a declaration of an explicit specialization for that template, the explicit instantiation has no effect. Otherwise, for an explicit instantiation definition the definition of a function template, a member function template, or a member function or static data member of a class template shall be present in every translation unit in which it is explicitly instantiated.