【发布时间】:2021-12-31 05:58:11
【问题描述】:
灵感来自2009 question
背景:我目前正在从事一个小型 c++ 项目,并决定尝试创建自己的模板类。我立即遇到了十几个链接器错误。
就目前而言,我的理解是模板特化只有在绝对需要时才会生成,这意味着模板类的实现必须内联,或者在底部伴随着显式实例化。 (为什么一个暗示另一个我不太确定)
问题:为什么会这样?如果模板在单独的.cpp 文件中实现,编译顺序是否有什么特别之处使得编译器无法按需实例化模板?在我看来,标题和实现只是简单地附加在一起。
另外,我上面链接的问题最初是在十多年前发布的,一些 cmets 注意到提到的 c++-faq 引用已经过时,所以我想知道是否有新的标准支持同时启用单独的 header/实现文件和隐式实例化。
【问题讨论】:
-
Is there something special about the order of compilation that makes it impossible for a compiler to instantiate the template on-demand if it is implemented in a separate .cpp file?一个编译单元只能看到它包含的内容。 Cpp 文件通常不包括在内,因此看不到。 -
在这方面没有任何改变,模板仍然只是头文件。 (不过,您可以使用模板做什么以及对元模板编程的支持已得到显着改进)