提问人:Vicent Marti 提问时间:8/30/2008 更新时间:7/7/2021 访问量:13982
模板分布在多个文件中
Templates spread across multiple files
问:
C++ 在跨多个文件声明模板时似乎相当笨拙。更具体地说,在使用模板化类时,链接器需要在单个编译器对象文件中为该类定义。当你考虑到标头、其他声明、继承等时,事情就会变得非常混乱。
对于跨多个文件组织或重新分发模板化成员定义,是否有任何一般建议或解决方法?
答:
跨越多少个文件?如果您只想将类定义与实现分开,请尝试 C++ 常见问题解答中的这篇文章。这是我目前所知道的唯一工作方式,但是某些IDE(例如Eclipse CDT)无法正确链接此方法,您可能会遇到很多错误。但是,编写自己的生成文件或使用Visual C++一直对我有用:-)
评论
对于跨多个文件组织或重新分发模板化成员定义,是否有任何一般建议或解决方法?
是的;不要。
C++ 规范允许编译器能够在实例化时“看到”整个模板(声明和定义),并且(由于任何实现的复杂性)大多数编译器都保留了此要求。结果是,任何模板标头的 #inclusion 也必须 #include 实例化模板所需的任何和所有源。
处理此问题的最简单方法是将所有内容转储到标头中,在可能的情况下内联,在必要时不行。
如果你真的认为这是一种不可接受的侮辱,一个常见的选择是将模板拆分为通常的标头/实现对,然后在标头的末尾 #include 实现文件。
C++ 的“导出”功能可能会也可能不会提供另一种解决方法。该功能支持不佳且定义不明确;虽然原则上它应该允许对模板进行某种单独的编译,但它并不一定能消除编译器能够看到整个模板主体的要求。
当编译器支持 C++0 时,关键字可用于将模板声明与定义分开。extern
有关简要说明,请参阅此处。
此外,David Vandevoorde 和 Nicolai M. Josuttis 合著的《C++ 模板:完整指南》第 6.3 节“分离模型”介绍了其他选项。
评论