首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现c++模板的优雅解决方案

实现c++模板的优雅解决方案
EN

Stack Overflow用户
提问于 2021-11-21 05:45:44
回答 1查看 159关注 0票数 1

受此2009年问题的启发

背景:我目前正在从事一个小型c++项目,并决定尝试创建自己的模板类。我立刻碰到了十几个链接器错误。

目前,我的理解是,模板专门化直到它们绝对需要时才会生成,这意味着模板类的实现必须是内联的,或者在底部有一个显式实例化。(为什么其中一个暗示另一个,我不太确定)

问:为什么会这样?如果模板是在一个单独的.cpp文件中实现的,那么编译顺序是否有什么特别之处,使得编译器无法按需实例化模板?在我看来,头和实现只是简单地附加在一起。

此外,我所链接的问题最初是在十多年前发布的,一些评论指出,提到的c++-faq引用已经过时,所以我想知道更新的标准是否支持支持单独的头/实现文件和隐式实例化的解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-21 05:55:41

为什么会这样呢?当模板在第一阶段通过两个阶段编译时,编译器主要检查语法错误。如果在模板中没有发现错误,则可以合法使用,但在此阶段编译器不为其生成任何代码。在第二阶段,编译器将为您使用的模板函数的所有类成员函数生成代码。

因为模板是在编译时计算的。那么,当编译器编译它时会发生什么呢?例如,如果您在templated.hpp文件中定义了一个模板,并在implementation.cpp文件中实现了它。编译器将每个文件分别编译成一个对象,然后链接器将它们链接到一起。由于模板是在编译时评估的,所以编译器需要在编译时实现它,如果您在不同的实现文件中使用它,则无法使用它。因此,链接者向您抱怨,我无法为您的模板找到T类型的实现。这一切都发生在编译时。

到目前为止,在C++20甚至C++23模板仍然需要在编译时进行评估之前--尽管C++添加了新的概念modules --我不确定它是否可以以这种方式使用,但是您可以阅读关于它的这里

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70052134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档