如何使用带有模板规范的类继承模板抽象类

时间:2015-04-11 10:21:33

标签: c++ templates inheritance abstract-class

我在linux上有一个构建到静态库的项目,然后我希望将其包含在单元测试项目和app项目中。

在这个库里我有类似的东西:

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) { ... }

};

我的lib中出现了编译错误:undefined reference to A<int>::A()。 我猜测它与模板生成有关,还可以覆盖这样的虚函数吗?

1 个答案:

答案 0 :(得分:0)

模板在编译期间生成,需要在它们原型化的同一翻译单元中实现。因此,如果要包含模板化类的声明,则还需要包含定义。

因此,在同一个头文件中同时使用声明和定义是明智的,因此,任何打算使用它的模块在编译时都可以根据需要生成定义。

参见:

14.7.2显式实例化[temp.explicit]

  

对于给定的模板参数集,如果是显式实例化   在声明显式特化之后出现模板   对于该模板,显式实例化无效。   否则,对于显式实例化定义的定义   功能模板,成员函数模板或成员函数   或模板中的静态数据成员应存在于每个模板中   明确实例化的翻译单元。