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