在跨多个文件声明模板时,C ++似乎相当不高兴。更具体地说,在使用模板化类时,链接器期望在单个编译器对象文件中对该类的所有方法定义。当你考虑标题,其他声明,继承等时,事情变得非常混乱。
是否有任何关于在多个文件中组织或重新分发模板化成员定义的一般建议或解决方法?
答案 0 :(得分:26)
是否有任何关于在多个文件中组织或重新分发模板化成员定义的一般建议或解决方法?
是;不。
C ++规范允许编译器能够在实例化时“看到”整个模板(声明和定义),并且(由于任何实现的复杂性)大多数编译器保留这个要求。结果是#inclusion任何模板头也必须#include实例化模板所需的任何和所有源。
处理此问题的最简单方法是将所有内容转储到标题中,并在必要时将其置于可行的内联线中。
如果你真的认为这是一个不可接受的冒犯,一个常见的选择是将模板拆分为通常的头/实现对,然后#include标题末尾的实现文件。
C ++的“导出”功能可能会也可能不会提供另一种解决方法。该功能支持不足,定义不明确;虽然它原则上应允许某种单独的模板编译,但它并不一定能避免编译器能够看到整个模板体的要求。
答案 1 :(得分:5)
多少个文件?如果您只想将类定义与实现分开,请在C ++ faqs中尝试this article。这是我所知道的唯一可行的方法,但是有些IDE(例如Eclipse CDT)不能正确链接这个方法,你可能会遇到很多错误。无论如何编写自己的makefile或使用Visual C ++,这一直对我有用: - )
答案 2 :(得分:3)
当/如果您的编译器支持C ++ 0x,extern
关键字可用于将模板声明与定义分开。
有关简要说明,请参阅here。
此外,David Vandevoorde和Nicolai M. Josuttis撰写的 C ++模板:完整指南的第6.3节“分离模型”描述了其他选项。