当跨多个文件声明模板时,C++ 似乎相当不高兴。更具体地说,在使用模板化类时,链接器期望该类的所有方法定义都位于单个编译器对象文件中。当您考虑标头、其他声明、继承等时,事情会变得非常混乱。

对于跨多个文件组织或重新分发模板化成员定义,是否有任何一般建议或解决方法?

有帮助吗?

解决方案

对于跨多个文件组织或重新分发模板化成员定义,是否有任何一般建议或解决方法?

是的;不。

C++ 规范允许编译器能够“查看”整个模板(声明 定义)在实例化点,并且(由于任何实现的复杂性)大多数编译器保留了这一要求。结果是任何模板标头的 #inclusion 也必须 #include 实例化模板所需的任何和所有源。

处理这个问题的最简单方法是将所有内容转储到标头中,尽可能内联,必要时外联。

如果您确实认为这是一种不可接受的冒犯,那么常见的选择是将模板拆分为常用的标头/实现对,然后在标头末尾#include 实现文件。

C++ 的“导出”功能可能会也可能不会提供另一种解决方法。该功能缺乏支持且定义不明确;尽管原则上它应该允许对模板进行某种单独的编译,但它不一定消除编译器能够看到整个模板主体的要求。

其他提示

跨多少个文件?如果您只想将类定义与实现分开,请尝试 本文 在 C++ 常见问题解答中。这是目前我所知道的唯一可行的方法,但是某些 IDE(例如 Eclipse CDT)无法正确链接此方法,并且您可能会收到很多错误。然而,编写自己的 makefile 或使用 Visual C++ 这对我来说一直有效:-)

当/如果您的编译器支持 C++0x 时, extern 关键字可用于将模板声明与定义分开。

这里 进行简要说明。

另外,第 6.3 节“分离模型” C++ 模板:完整指南 作者:David Vandevoorde 和 Nicolai M.Josuttis 描述了其他选择。

alt text

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top