假设我在MyHeader.h
中有模板代码,然后将其包含在2个编译单元A.cpp
和B.cpp
中。这两个文件然后实例化相同的模板函数,比如f<int>();
(后者在MyHeader.h
中定义非内联)。
据我所知,发生了以下情况。编译器在f<int>();
和A.obj
中生成B.obj
的代码,然后liker丢弃链接阶段的其中一个符号。
我的问题:这种做法总是&#34;安全&#34;?即,是否会有抱怨重复符号的连接符? 标准是否对此有所说明?如果是,我无法找到任何解决方案来制作我的所有模板函数inline
。
答案 0 :(得分:7)
这始终是安全的并且由ODR涵盖。 §3.2/ 6:
如果每个定义出现在不同的翻译单元中,则程序中的非静态函数模板(14.5.6)[...]可以有多个定义, 并且提供的定义满足以下要求。 [...长列表...] 如果
D
的定义满足所有这些要求, 然后行为好像只有D
的单一定义。如果D
的定义不满足这些要求,那么行为是未定义的。
如果您编写合理的代码,我应该满足我跳过的需求列表。