莫是多音字吗:请教C++模板函数在编译时处理

来源:百度文库 编辑:高考问答 时间:2024/05/09 12:38:54
++++++++++++验证用代码+++++++++++++++++++++++
#include <iostream.h>

template <class t ,class p>

p test(t a,p b)
{
p value = a*b;

return value;
}

int main()
{
int v1=1;
float u1=2.5;
cout<<"value="<<test(v1,u1)<<endl;
return 0;
}
+++++++++验证用代码+++++++++++++++++++++++++++

我写了如上代码考察模板函数的工作,编译通过;但如果把p test(t a ,p b)改写为t test(t a,p b)编译就出现这个错误:conversion from 'float' to 'int', possible loss of data。

我对此的理解是这样,编译器发现了函数调用cout<<"value="<<test(v1,u1)<<endl; 然后再回头验证模板函数的返回类型,最后发现语法错误的啊。

请问我的理解对吗,此外能给出模板函数中形式参数更复杂的情况嘛,或是其它容易引起混淆的模板函数吗,小生好学点排错的能力,谢谢。

模板函数类型检查是放在调用的时候检查的.因为在定义的时候是没有办法区分的(比如你这个例子,就存在int转换float和float转换int的警告级别差异.)

所以严格的说来,编译器是发现调用了test(v1,u1),才开始检查的.由于底层实现将形参类型用实际V1和u1的类型做了替换,然后就可以实际判断隐式转换的合理性.