将C ++标头模板编译为共享库

时间:2012-07-22 17:20:56

标签: c++ templates shared-libraries

我正在研究模板类的代码库。它只是标题(没有.cpp文件)。我想隐藏实现并提供一个共享库以及一些仅包含声明的头文件。不幸的是听起来没有意义。由于没有编译代码,所以在这样的共享库中会有什么?尝试在编译后从头中删除定义,会导致未定义的引用。有没有办法强制编译器在dll或共享库中发送对象而不必显式实例化模板类?

2 个答案:

答案 0 :(得分:5)

不,在可预见的未来,没有也不会有办法做到这一点。提供模板C ++代码的唯一方法是仅作为头文件。 Modules可能会改变这种情况,但在图书馆完成之前不太可能发生这种情况。

您可以尝试的是拆分为实现并显式实例化所有可能的用例。然后你发布的库将不会使用任何其他类型然后实例化的库,并将显着减少模板带来的好处。

答案 1 :(得分:3)

模板实现需要在编译时知道。这就是为什么你不能将实现与声明分开的原因。因此,如果您希望获得模板的优势,则无法传递标题。