我知道以下代码会导致链接错误:
//first.cpp
void test(){
//random code
}
//second.cpp
void test(){
//random code
}
Run Code Online (Sandbox Code Playgroud)
所以让我们说我们有这个函数模板:
template<typename T>
T test(){
//random code
}
Run Code Online (Sandbox Code Playgroud)
并且正在这样做:
//first.cpp
...
test<void>();
//second.cpp
...
test<void>();
Run Code Online (Sandbox Code Playgroud)
所以我理解编译器如何工作的方式是它只关心每个文件,所以它只关心test<void>()
必须有一个定义,因此它会创建一个。同样的事情也适用,second.cpp
那么为什么我们在后期有两个定义时不会收到链接器错误test<void>
。 (我认为这应该与第一个示例相同,其中两个void test()
函数在单独的文件中导致链接错误)
如果这是重复的我很抱歉我真的不知道如何搜索这个。
链接器不会抱怨,因为标准是这样说的:
\n\n\n\n
[basic.def.odr]/13
\n
\n...
\n\xe2\x80\x94 内联函数或变量可以有多个定义...\xe2\x80\x94 模板化实体 ...
\n
在这方面,链接器将它们视为内联处理。
\n请注意,它们实际上并非如此inline
(出于优化目的)。您可以将它们标记为inline
您自己,暗示编译器应该内联它们。