关于函数模板的一些心得

1、template后有几个参数,下方函数内容就需要用几个函数
这样不会报错
关于函数模板的一些心得

这样会报错
关于函数模板的一些心得

报错内容如下
关于函数模板的一些心得

从报错的第一行可以看出,错误就是函数模板的定义里面没有用到全部的参数,此例为typename Y

如果把第二个参数T改成Y,错误消失,可以运行
关于函数模板的一些心得

有趣的是,尽管在template后我们定义T Y是两种不同的类型,但在实际应用时可以传两种相同类型的参数
2、如果实际函数的参数和声明模板的参数不同,会报错。

比如我们有一个函数模板,只有一种虚拟类型T
如果传入一种参数,不会报错:
关于函数模板的一些心得

如果实际传入两种参数,会报错
关于函数模板的一些心得

错误列表如下:
关于函数模板的一些心得

最后一行大致意思为:系统在编译时没有找到两个参数不同的Max模板函数
显然,如果我们增加一个虚拟类型Y,并把下方形参改变,错误就会消失。但是我突发奇想,想看一下函数模板是否可以重构。经过试验后发现,函数模板也可以重构(虽然没有任何应用价值,因为我觉得函数模板的提出就是为了在某些情况下解决函数重构还需要重写一遍带来的麻烦)
实验结果如下:
关于函数模板的一些心得

这个图尤其要注意17行,一方面是把i声明为double变量,另一方面是返回值变成了2
这是因为我们模板声明的返回类型是T(11行),在我们用的时候,T和int匹配(17行),所以我推测,是把返回值2.1强制类型转换成了int(把i的声明从int改成double是确保造成这个情况的原因不是把返回的double赋成int造成的精度损失)
如果把17行参数位置换一下
关于函数模板的一些心得

那么i就会变成2.1

这也是函数模板和函数有区别的地方,如果在函数中形参和实参不匹配,有时会发生强制类型转换。
关于函数模板的一些心得

如图所示,我们传入的参数是double类型,但是监视Max函数的参数a的值的时候,确是2,证明在传参的时候发生了强制类型转换。