当在多个文件中声明模板时,C++似乎相当粗糙。更具体地说,当使用模板化类时,链接器期望在单个编译器对象文件中的类的所有方法定义。当你考虑标题,其他声明,继承等等时,事情变得非常混乱。模板分布在多个文件中
是否有任何常规建议或变通方法来组织或重新分发跨多个文件的模板成员定义?
当在多个文件中声明模板时,C++似乎相当粗糙。更具体地说,当使用模板化类时,链接器期望在单个编译器对象文件中的类的所有方法定义。当你考虑标题,其他声明,继承等等时,事情变得非常混乱。模板分布在多个文件中
是否有任何常规建议或变通方法来组织或重新分发跨多个文件的模板成员定义?
有没有组织或跨多个文件重新分配模板成员定义的任何一般性的建议或解决方法?
是;别。
的C++规范允许编译器能够“看到”整个模板(声明和定义)在实例化的点,(由于任何实现的复杂性),大多数编译器保留了这一要求。结果是,包含任何模板头文件必须包含实例化模板所需的任何和所有源文件。
解决这个问题的最简单方法是将所有内容转储到标题中,并在需要时在内联的地方进行内联。
如果你真的认为这是一个不可接受的侮辱,一个常见的选择是将模板分割成通常的头/实现对,然后#在头的末尾包含实现文件。
C++的“导出”功能可能提供或不提供其他解决方法。该功能支持不足,定义不明确;尽管它原则上应该允许某种模板的单独编译,但它并不一定会避免编译器能够看到整个模板体的需求。
跨多少个文件?如果您只想将类定义与实现分开,请在C++ faq中尝试使用this article。这是我目前知道的唯一方法,但是一些IDE(例如Eclipse CDT)不会正确地链接此方法,并且您可能会遇到很多错误。然而编写自己的makefile或使用Visual C++中,这一直为我工作:-)
当/如果您的编译器支持C++ 0x,则可以使用extern
关键字将模板声明与定义分开。
有关简要说明,请参见here。
另外,第6.3节,“的分离模型”的C++模板:由David Vandevoorde和尼古拉M.约祖蒂斯完全指南描述了其它选项。
alt text http://ak.buy.com/db_assets/prod_images/235/31025235.jpg
+1的文章链接 – 2013-06-18 19:20:51