题
当跨多个文件声明模板时,C++ 似乎相当不高兴。更具体地说,在使用模板化类时,链接器期望该类的所有方法定义都位于单个编译器对象文件中。当您考虑标头、其他声明、继承等时,事情会变得非常混乱。
对于跨多个文件组织或重新分发模板化成员定义,是否有任何一般建议或解决方法?
解决方案
对于跨多个文件组织或重新分发模板化成员定义,是否有任何一般建议或解决方法?
是的;不。
C++ 规范允许编译器能够“查看”整个模板(声明 和 定义)在实例化点,并且(由于任何实现的复杂性)大多数编译器保留了这一要求。结果是任何模板标头的 #inclusion 也必须 #include 实例化模板所需的任何和所有源。
处理这个问题的最简单方法是将所有内容转储到标头中,尽可能内联,必要时外联。
如果您确实认为这是一种不可接受的冒犯,那么常见的选择是将模板拆分为常用的标头/实现对,然后在标头末尾#include 实现文件。
C++ 的“导出”功能可能会也可能不会提供另一种解决方法。该功能缺乏支持且定义不明确;尽管原则上它应该允许对模板进行某种单独的编译,但它不一定消除编译器能够看到整个模板主体的要求。
不隶属于 StackOverflow