

然后我们再来看一下普通函数和函数模板的调用规则


可以看到有4个,
1.如果函数模板和普通函数都可以地调用的时候,优先调用普通函数
2.可以通过空模板参数列表,强制调用,函数模板
3.函数模板可以发生函数重载
4.如果函数模板可以产生更好的匹配,就优先调用函数模板
有上面4个调用的规则.


我们用例子去看一下
我们去写一个普通的函数myPrint(int a,intb),
然后我们再去写一个模板template
然后我们再去写一个myPrint函数,这里使用模板来实现的这个,函数模板


然后我们写个测试方法test01,去调用一下
myPrint,因为我们现在有两个myPrint函数,一个是普通函数,
一个是函数模板,这个时候,他会调用哪个函数呢?


可以看到调用的是普通函数.


这个就是调用规则的第一点,
如果函数模板和普通函数都可以调用,会优先调用普通函数



然后我们再去看,首先我们,注释掉普通函数的实现


可以看到立*报马**错了对吧,因为他去调用普通函数,但是现在普通函数,没有主体了,只有一个
声明了.


然后我们再去看看,现在我们普通函数调用不了,我们只能调用模板函数了,
这个时候,我们可以不给模板函数传任何参数,我们直接,写个<> 空的参数类型
然后传入参数,a,b就可以了.


这个时候可以看到,就调用到了,函数模板的了,强制调用的


然后我们再去把,上面普通函数的,函数体的注释给打开.


然后我们执行,可以看到,依然是调用的函数模板对吧.
这说明我们是强制调用的,函数模板对吧,使用<>空的参数类型实现的.



然后我们再去看,实际上,函数模板,也是可以重载的,可以看到
上面,我又,写了一个myPrint,给了3个参数,这3个参数,就是上面两个
参数的myPrint函数模板的,重载函数模板.


可以看到执行也不报错对吧.


然后我们去调用一下看看,可以看到都可以调用没报错
我们暂时把上面myPrint(a,b),注释掉


然后执行去看看,可以看到
显示的是调用重载模板对吧,表示重载的函数模板被调用了.


然后我们注释掉,上面的测试代码


然后我们再去写两个char类型的数据,去测试一下


可以看到上面现在有两个myPrint可以给我们调用,一个是普通函数,参数类型的int,
一个是函数模板,参数类型不确定是T


然后我们去执行


可以看到上面调用的是函数模板对吧,这说明什么?
当,有两个myPrint函数,都可以调用的时候,
如果普通函数的调用,可以看到普通函数的参数是int,而我们声明的变量类型是char,
如果调用普通函数,c++编译器,需要做一层隐式转换,这个太麻烦了.
所以c++编译器就会直接调用函数模板,以自动推导方式来调用


上面是总结,可以看到上面就说了c++中,函数模板和普通函数的调用规则.