我正在研究模板类的代码库。它只是标题(没有.cpp文件)。我想隐藏实现并提供一个共享库以及一些仅包含声明的头文件。不幸的是听起来没有意义。由于没有编译代码,所以在这样的共享库中会有什么?尝试在编译后从头中删除定义,会导致未定义的引用。有没有办法强制编译器在dll或共享库中发送对象而不必显式实例化模板类?
答案 0 :(得分:5)
不,在可预见的未来,没有也不会有办法做到这一点。提供模板C ++代码的唯一方法是仅作为头文件。 Modules可能会改变这种情况,但在图书馆完成之前不太可能发生这种情况。
您可以尝试的是拆分为实现并显式实例化所有可能的用例。然后你发布的库将不会使用任何其他类型然后实例化的库,并将显着减少模板带来的好处。
答案 1 :(得分:3)
模板实现需要在编译时知道。这就是为什么你不能将实现与声明分开的原因。因此,如果您希望获得模板的优势,则无法传递标题。