模板分布在多个文件中

时间:2020-03-05 18:45:27  来源:igfitidea点击:

当在多个文件中声明模板时,C ++似乎很讨厌。更具体地说,在使用模板化类时,链接程序应在单个编译器目标文件中期望该类的所有方法定义。当我们考虑标头,其他声明,继承等时,事情就会变得非常混乱。

对于在多个文件中组织或者重新分配模板化的成员定义,是否有任何一般性建议或者解决方法?

解决方案

回答

跨多少个文件?如果我们只想将类定义与实现分开,请在C ++常见问题解答中尝试本文。这是目前我所知道的唯一方法,但是某些IDE(例如Eclipse CDT)无法正确链接此方法,我们可能会遇到很多错误。但是,编写自己的makefile或者使用Visual C ++始终对我有用:-)

回答

Are there any general advice or workarounds for organizing or redistributing templated member definitions across multiple files?

是的;别。

C ++规范允许编译器能够在实例化点"看到"整个模板(声明和定义),并且(由于任何实现的复杂性)大多数编译器都保留了这一要求。结果是#inclusion任何模板标头也必须#include实例化模板所需的任何和所有源。

解决此问题的最简单方法是将所有内容转储到标头中,如果可能,应内联,应在行外。

如果我们确实认为这是不可接受的侮辱,则一个常见的选择是将模板拆分为通常的标头/实现对,然后在标头末尾#include实现文件。

C ++的"导出"功能可能会或者可能不会提供其他解决方法。该功能支持不佳且定义不明确;尽管从原则上讲它应该允许模板的某种单独的编译,但是并不一定消除了编译器能够看到整个模板主体的要求。

回答

当/如果编译器支持C ++ 0x,则可以使用extern关键字将模板声明与定义分开。

请参阅此处以获取简要说明。

另外,David Vandevoorde和Nicolai M. Josuttis撰写的C ++模板6.3节"分离模型":完整指南介绍了其他选项。

替代文字http://ak.buy.com/db_assets/prod_images/235/31025235.jpg