1

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

4

2 回答 2

4

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

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

另见为什么模板只能在头文件中实现?

于 2012-05-05T01:05:04.530 回答
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>),您无法对其进行实例化,因此无法将其放入库中。

于 2012-05-06T17:56:37.583 回答