如何从嵌套的模板化类中创建静态库?

时间:2012-05-05 00:53:12

标签: c++ c++11

我在C ++中有一些我想要创建静态库的类。其中一个类是哈希表类,它使用另外两个来创建对象。我已经尝试在另一个问题的答案中跟随另一个small demonstration,但我生成的库似乎没有定义我在测试程序中编写的任何内容。我已经尝试了所有的声明和在单个文件中实现并分成头/源,但这种安排似乎并不重要。如何将我的类放入静态libHash.a?

2 个答案:

答案 0 :(得分:4)

以对象形式分发模板不能很好地工作,因为编译器无法创建新的实例化。您的库的用户只能访问库中定义的模板实例。

这就是模板类和函数通常在头文件中实现的原因。

另见Why can templates only be implemented in the header file?

答案 1 :(得分:1)

您可以将模板实例化放入库中,但模板必须位于标头中。如果您事先知道要实例化的模板的哪些特化,那么您可以在标头中声明显式实例化,然后在.cpp中定义那些被编译并放入.a的显式实例化

// hash.h

template<typename T> struct Hash { };
// declare explicit instantiation
extern template class Hash<int>;

// Hash.cpp

#include <Hash.h>
// define explicit instantiation
template class Hash<int>;

但是对于您无法事先知道的实例化(例如Hash<SomeOtherPersonsType>),您无法实例化它,因此无法将其放入库中。