我在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()
。
我猜测它与模板生成有关,还可以覆盖这样的虚函数吗?
答案 0 :(得分:0)
模板在编译期间生成,需要在它们原型化的同一翻译单元中实现。因此,如果要包含模板化类的声明,则还需要包含定义。
因此,在同一个头文件中同时使用声明和定义是明智的,因此,任何打算使用它的模块在编译时都可以根据需要生成定义。
参见:
14.7.2显式实例化[temp.explicit]
对于给定的模板参数集,如果是显式实例化 在声明显式特化之后出现模板 对于该模板,显式实例化无效。 否则,对于显式实例化定义的定义 功能模板,成员函数模板或成员函数 或模板中的静态数据成员应存在于每个模板中 明确实例化的翻译单元。