如何使用具有模板规范的 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.