【问题标题】:compile C++ header-only templates to a shared library将 C++ 仅标头模板编译为共享库
【发布时间】:2012-07-22 17:20:56
【问题描述】:

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

【问题讨论】:

  • 我认为您可以将模板拆分为 h 和 cpp 文件,并拥有一个明确实例化所有可能情况的共享库。现在您可以将其发送给您的客户,他们可以链接到它。他们可能无法为新类型实例化您的模板,但可以使其工作
  • @paraupura,是的。事实上,这是一个答案。

标签: c++ templates shared-libraries


【解决方案1】:

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

您可以尝试的方法是将实现拆分并显式实例化所有可能的用例。然后,您发布的库将无法与实例化类型之外的任何其他类型一起使用,并且会显着减少模板带来的好处。

【讨论】:

  • 我想。我很愚蠢,犯了一个错误。天哪,这似乎很愚蠢!我需要阅读有关模块的信息。
【解决方案2】:

需要在编译时知道模板实现。这就是为什么您不能将实现与声明分开的原因。所以如果你想拥有模板的优势,就没有办法传递你的标题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多