#include <iostream>
using namespace std;
template <typename T>
T sum(T a, T b){
return a + b;
}
int main(){
int a = 3, b = 4;
cout << "sum(int, int) = " << sum(a, b) << endl;
float f1 = 1.3, f2 = 9.1;
cout << "sum(float, float) = " << sum(f1, f2) << endl;
return 0;
}
函数模板设置默认值的实验:
#include <iostream>
using namespace std;
template <typename T0 = float,
typename T1,
typename T2 = float,
typename T3,
typename T4>
T0 func(T1 v1, T2 v2, T3 v3, T4 v4){
cout << "func() is called" << endl;
return 0.1;
}
int main(){
//func(1, 2, 3);//ERROR:no matching function for call to 'func(int, int, int)'
func(1, 2, 3, 4);
//func('a', 'b', "cde");//ERROR:no matching function for call to 'func(char, char, const char [4])'
func('a', 'b', "cde", 'f');
return 0;
}
我惊奇地发现:学堂在线上徐明星老师讲错了!我电脑上的Dev C++并没有通过main函数中注释掉的那两行代码!而是报了错:没有匹配相应参数个数的函数。但是如果实参个数与形参个数相匹配(相同),即使T2被设置成了默认float,却依然能通过全是int和全是char/string型的实参的编译!
实践出真知!这说明什么?说明徐老师讲的也许是C++的标准,但就像汽车尾气排放标准一样,标准是在那里放着,但并不是所有车型都实现了欧III欧IV,最终还是要以厂家实际的产品特性为准。汽车产品的实际排放特性是由汽车厂家决定的,编译器实际支持的语言特性是由编译器开发者决定的。在Dev C++ 5.11中,并不支持函数参数的缺省。
即使把T2 v2放到函数形参列表的最后面,也不能通过编译:
#include <iostream>
using namespace std;
template <typename T0 = float,
typename T1,
typename T2 = float,
typename T3,
typename T4>
T0 func(T1 v1, T3 v3, T4 v4, T2 v2){
cout << "func() is called" << endl;
return 0.1;
}
int main(){
//func(1, 2, 3);//ERROR:no matching function for call to 'func(int, int, int)'
func(1, 2, 3, 4);
//func('a', 'b', "cde");//ERROR:no matching function for call to 'func(char, char, const char [4])'
func('a', 'b', "cde", 'f');
return 0;
}
报错信息与之前一样。