模板实例化如何不会导致链接错误

Cla*_*ssY 5 c++ templates

我知道以下代码会导致链接错误:

//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()函数在单独的文件中导致链接错误)

如果这是重复的我很抱歉我真的不知道如何搜索这个。

Hol*_*Cat 4

链接器不会抱怨,因为标准是这样说的:

\n
\n

[basic.def.odr]/13

\n


\n...
\n\xe2\x80\x94 内联函数或变量可以有多个定义...

\n

\xe2\x80\x94 模板化实体 ...

\n
\n

在这方面,链接器将它们视为内联处理。

\n

请注意,它们实际上并非如此inline(出于优化目的)。您可以将它们标记为inline您自己,暗示编译器应该内联它们。

\n