前情
首先明确,
- 模板实参表是用“ < > ”括起来的实参表
- 模板函数实参表是用“ ( ) ”括起来的实参表
分析
- 如果能根据模板函数实参表得到足够的信息确定全部虚拟类型参数对应的实际参数,且是参数表的后几个,就可以省略。
示例代码段一
#include <iostream>
using namespace std;
template <typename T1, typename T2>
T1 func(T2 n) { return n*1.2; }
int main() {
int a = 1;
cout << func<int>(a) << endl;
// 正确,a 的类型为 int,可以确定 T2 为 int,且其位于模板实参表后面,因此可以省略给 T2的传递
cout << func<double>(a) << endl; // 正确
return 0;
}
示例代码段二 错误示例
#include <iostream>
using namespace std;
template <typename T1, typename T2>
T2 func(T1 n) { return n*1.2; } //与前一段代码不同,T1 和 T2 交换了位置
int main() {
int a = 1;
cout << func<int>(a) << endl;
//错误,a 的类型为 int,可以确定 T1 为 int,但其位于模板实参表前面,因此无法确定 T2
return 0;
}
示例代码段三 修改
cout << func<int, double>(a) << endl;
- 若可全部省略,则“<>”也可以省略。
参考资料:
https://blog.youkuaiyun.com/weixin_43971764/article/details/88896885