English 中文(简体)
分布在多个文件中的模板
原标题:
  • 时间:2008-08-30 15:27:34
  •  标签:

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

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

最佳回答

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

对不要。

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

处理这一问题的最简单方法是将所有内容转储到标头中,在可能的情况下内联,在必要的情况下离线。

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

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

问题回答

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

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

请参阅此处进行简要解释。

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





相关问题
热门标签