显式实例化函数模板调用未显式实例化的模板时,后者会被实例化吗?
显式实例化函数模板时,内部调用的未显式实例化模板会自动实例化吗?
答案是肯定的——当你显式实例化某一函数模板时,编译器会自动实例化该函数内部调用的所有依赖函数模板(对应匹配的类型),不需要额外显式声明。
结合你的代码分析
在library.cpp中,你显式实例化了Library::print_vector<const std::vector<int>&>:
template void Library::print_vector(const std::vector<int>&);
编译器生成这个具体函数的二进制代码时,会发现它内部循环调用了print(x),这里的x是int类型,所以会隐式实例化Library::print<int>。因为print模板的完整定义就在同一个编译单元(library.cpp)里,编译器能直接生成print<int>的代码,和print_vector<int>一起编译进目标文件,所以链接时不会报错。
关键知识点
- 函数模板的实例化分两种:显式实例化(手动指定
template void func<T>(...))和隐式实例化(编译器在需要具体类型实现时自动生成)。 - 当一个已实例化的函数调用另一个函数模板时,只要编译器能看到被调用模板的完整定义,就会自动触发对应类型的隐式实例化。
- 反过来,如果
print模板的定义不在library.cpp中(比如只在头文件声明,定义在其他未被包含的源文件),那显式实例化print_vector<int>时,编译器找不到print<int>的实现,就会出现链接错误。
内容的提问来源于stack exchange,提问作者Hakim
相关产品推荐
相关产品推荐

