在多个编译单元中包含模板代码,它是否总是在没有内联的情况下链接?

时间:2015-05-15 16:36:36

标签: c++ templates linker

假设我在MyHeader.h中有模板代码,然后将其包含在2个编译单元A.cppB.cpp中。这两个文件然后实例化相同的模板函数,比如f<int>();(后者在MyHeader.h中定义非内联)。

据我所知,发生了以下情况。编译器在f<int>();A.obj中生成B.obj的代码,然后liker丢弃链接阶段的其中一个符号。

我的问题:这种做法总是&#34;安全&#34;?即,是否会有抱怨重复符号的连接符? 标准是否对此有所说明?如果是,我无法找到任何解决方案来制作我的所有模板函数inline

1 个答案:

答案 0 :(得分:7)

这始终是安全的并且由ODR涵盖。 §3.2/ 6:

  

如果每个定义出现在不同的翻译单元中,则程序中的非静态函数模板(14.5.6)[...]可以有多个定义,   并且提供的定义满足以下要求。 [...长列表...] 如果D的定义满足所有这些要求,   然后行为好像只有D的单一定义。如果D的定义不满足这些要求,那么行为是未定义的。

如果您编写合理的代码,我应该满足我跳过的需求列表。