面试题答案
一键面试-
编译器选择规则
- 首先,编译器会优先寻找完全匹配的特化版本。如果存在针对特定类型的特化模板,并且参数列表完全匹配,那么编译器将选择该特化版本。
- 如果没有找到完全匹配的特化版本,编译器会在普通函数模板中寻找最匹配的版本。匹配程度根据函数参数的精确程度来判断,比如参数个数、类型转换等。
-
代码示例
#include <iostream>
// 普通函数模板
template <typename T>
void func(T param) {
std::cout << "普通函数模板:func(T param), param = " << param << std::endl;
}
// 重载的普通函数模板
template <typename T>
void func(T param, int num) {
std::cout << "重载的普通函数模板:func(T param, int num), param = " << param << ", num = " << num << std::endl;
}
// 针对int类型的特化
template <>
void func<int>(int param) {
std::cout << "针对int类型的特化:func<int>(int param), param = " << param << std::endl;
}
int main() {
int a = 10;
double b = 20.5;
func(a); // 优先匹配针对int类型的特化版本
func(b); // 匹配普通函数模板func(T param)
func(a, 5); // 匹配重载的普通函数模板func(T param, int num)
return 0;
}
在上述代码中:
- 当调用
func(a)
时,因为存在针对int
类型的特化template <> void func<int>(int param);
,所以编译器优先选择这个特化版本。 - 当调用
func(b)
时,由于没有针对double
类型的特化,编译器会选择普通函数模板template <typename T> void func(T param);
。 - 当调用
func(a, 5)
时,没有完全匹配的特化版本,但是有匹配的重载普通函数模板template <typename T> void func(T param, int num);
,所以编译器选择该重载版本。