假设此处调用函数
int a=1; float b=1.0; func(a, b); //调用函数
若func为非模板函数,编译器查找所有的名称为func
的函数,然后检查函数入参的数量,再然后检查每个入参是否都可以转换到目标类型。(此处注意,如果参数类型为类对象,若该类支持隐式转换,那么会出现如下情况:
class Test{ int x; Test(int n):x(n){} } void func(Test &t,float k); //... func(1,1.0); //合法,1被隐式转换为了Test(1)临时变量
)
如果检索到唯一的函数,则调用该方法;如果有多个函数符合,编译器会挑选出最佳重载的方法进行调用,如果挑选不出,编译器就会报错(歧义错误 ambigouous error)。
若func为模板函数,编译器将会查找名称与入参类型都要完全匹配的模板方法。看下面这个例子:
class Test{
public: int x; Test(int n):x(n){} } template<typename T> void func(T &a,T &b); //... func(1,1.0); //非法
Test t(1);
func(1,t); //非法
此时第一次调用func入参为1,1.0,类型为int和double,没有匹配的模板。
第二次调用func入参为1,1.0,类型为int和Test,没有匹配的模板。
也就是说,编译器寻找匹配的模板函数时,不会去考虑隐式转换而是先考虑参数类型。
标签:函数,int,c++,编译器,调用函数,func,Test,模板 From: https://www.cnblogs.com/Explosion556/p/17366914.html