23

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

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

4

3 回答 3

27

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

是的; 不。

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

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

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

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

于 2008-08-30T16:19:04.570 回答
5

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

于 2008-08-30T15:31:41.457 回答
3

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

请参阅此处以获取简要说明。

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

替代文字

于 2008-09-18T17:48:47.267 回答