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