我在C ++中有一些我想要创建静态库的类。其中一个类是哈希表类,它使用另外两个来创建对象。我已经尝试在另一个问题的答案中跟随另一个small demonstration,但我生成的库似乎没有定义我在测试程序中编写的任何内容。我已经尝试了所有的声明和在单个文件中实现并分成头/源,但这种安排似乎并不重要。如何将我的类放入静态libHash.a?
答案 0 :(得分:4)
以对象形式分发模板不能很好地工作,因为编译器无法创建新的实例化。您的库的用户只能访问库中定义的模板实例。
这就是模板类和函数通常在头文件中实现的原因。
答案 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>
),您无法实例化它,因此无法将其放入库中。