关于C#:模板分布在多个文件中

Templates spread across multiple files

当在多个文件中声明模板时,

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

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


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

是的;不要。

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

处理此问题的最简单方法是将所有内容转储到标头中,在可能的地方内联,在必要时外出。

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

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


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


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

请参阅此处以进行简要说明。

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

alt

推荐阅读