gpt4 book ai didi

c++ - 函数模板的实例化

转载 作者:行者123 更新时间:2023-12-01 20:03:58 25 4
gpt4 key购买 nike

在下面的程序中,我们获取没有可用定义的函数模板的地址。

template <typename T>
void fun(T);

int main()
{
void (*funptr)(int) = fun;
}

我被告知,编译器决定在获取函数模板的地址时实例化函数模板,但上面的程序编译得很好(当然链接器会抛出一个错误,指出它找不到 fun 的定义)。仅当我们使用显式实例化时,编译才会失败:

template <typename T>
void fun(T);

template void fun<int>(int);

int main()
{}

这是否意味着只有编译第二个源代码才能实例化函数模板?或者它也在第一个实例中实例化,但我错过了一些东西?

提前致谢!

最佳答案

当您获取地址或调用函数时,编译器会留下对其实例化的引用。如果有模板定义,它将被实例化以满足该引用。但由于没有提供模板定义,因此无法实际实例化,因此只剩下未解析的引用。该未解析的引用必须在链接阶段由包含必要实例化的不同目标文件解析。这意味着实例化必须在编译其他目标文件时发生。

显式实例化函数模板时,模板定义must be present (否则,没有什么可实例化的)。由于您没有提供错误,因此您会在编译阶段而不是链接阶段收到错误。

关于c++ - 函数模板的实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60115230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com