函数模板的实例化
Instantiation of function templates
在下面的程序中,我们获取了一个没有定义的函数模板的地址。
template <typename T>
void fun(T);
int main()
{
void (*funptr)(int) = fun;
}
我被告知编译器决定在获取地址时实例化一个函数模板,但是上面的程序编译得很好(当然链接器会抛出找不到 [=12= 的定义的错误) ]).仅当我们使用显式实例化时编译才会失败:
template <typename T>
void fun(T);
template void fun<int>(int);
int main()
{}
这是否意味着只编译第二个源代码实例化功能模板?或者它是否也在第一个实例化但我遗漏了什么?
提前致谢!
当您获取地址或调用函数时,编译器会留下对其实例化的引用。如果有模板定义,它就会被实例化以满足该引用。但是由于没有提供模板定义,无法真正实例化,所以只剩下未解析的引用。未解析的引用必须在链接阶段由不同的目标文件解析,该文件包含必要的实例化。这意味着实例化一定是在编译其他目标文件时发生的。
显式实例化函数模板时,模板定义must be present(否则,没有什么可实例化的)。由于您没有提供,因此在编译阶段出现错误,而不是链接。
在下面的程序中,我们获取了一个没有定义的函数模板的地址。
template <typename T>
void fun(T);
int main()
{
void (*funptr)(int) = fun;
}
我被告知编译器决定在获取地址时实例化一个函数模板,但是上面的程序编译得很好(当然链接器会抛出找不到 [=12= 的定义的错误) ]).仅当我们使用显式实例化时编译才会失败:
template <typename T>
void fun(T);
template void fun<int>(int);
int main()
{}
这是否意味着只编译第二个源代码实例化功能模板?或者它是否也在第一个实例化但我遗漏了什么?
提前致谢!
当您获取地址或调用函数时,编译器会留下对其实例化的引用。如果有模板定义,它就会被实例化以满足该引用。但是由于没有提供模板定义,无法真正实例化,所以只剩下未解析的引用。未解析的引用必须在链接阶段由不同的目标文件解析,该文件包含必要的实例化。这意味着实例化一定是在编译其他目标文件时发生的。
显式实例化函数模板时,模板定义must be present(否则,没有什么可实例化的)。由于您没有提供,因此在编译阶段出现错误,而不是链接。