template函数和函数的重载的调用判断
来源:互联网 发布:javascript的var 编辑:程序博客网 时间:2024/05/22 03:08
struct H {};
struct G
{
operator H() const { printf("!!!/n"); return H();}
};
template <class T>
void ff(T, H) //T不用转换,H 转换一次,共一次。T参数满足--当在其他同名函数中没有这个参数的满足的情况下,范型算是满足(共一次)
{
printf("int,T/n");
}
void ff(int, G) //G不用转换,int转换一次,共一次。G参数满足(共一次)
{
printf("int,float/n");
}
short i = 0;
G g;
ff(i, g);
编译错误。因为2个函数都需要转换一次,并且满足的参数次数一致,都一次。所以错误。
调用哪个函数的判断的标准是转换次数的大小。选择次数小的。但是在转换次数一致的情况下会去检查参数的满足次数,选择满足次数多的。(当然,这是在编译器能够推断模板参数的情况下,即可以具现模板函数的情况下)
template <class T>
void ff(T, int) //T不用转换,int转换一次
{
printf("int,T/n");
}
void ff(short, float) //short不用转换,float转换2次
{
printf("int,float/n");
}
short i = 0;
short s = 0;
ff(i, s);
输出int T
再看个例子:
void fffff(float)
{
printf("1111/n");
}
template <class T>
void fffff(int)
{
printf("2222/n");
}
fffff(int());
输出为1111, 为什么不是2222呢,不是int的转换次数小么,的确是int次数小,但是因为编译器推断不出T的类型,所以并不会具现化模板函数,这样就会走非模板的函数,即float.
此外用户定义的转换会先于系统的隐式转换。
struct Convert
{
operator float() const {printf("float/n"); return 1.0;}
operator int() {printf("int/n"); return 1;}
};
void ffff(float)
{
printf("float/n");
}
ffff(Convert());
输出是int float 说明用户转换先于系统转换被调用,因为
operator float() const {printf("float/n"); return 1.0;}要先把Convert->const Convert是属于先系统调用,所以还是
选择int转换。(不过转换次数还是算一次, 即const volatile的转换不算在转换次数里)
- template函数和函数的重载的调用判断
- 函数模板template-重载的模板
- c++的函数的重载原理分析和调用约定
- C++中函数重载的判断依据
- 函数的重载和重写
- 函数的重写和重载
- 函数的重载和继承
- 函数 函数的重载
- 函数-函数的重载
- sqrt对重载函数的调用不明确
- 关于函数模板重载的调用顺序
- QtQuick中调用c++的重载函数
- 函数调用运算符的重载
- 确定重载函数被调用的依据
- 用C++ Variadic Template 和 lambda表达式简化判断函数返回值的语句
- 函数重载和函数覆盖的区别
- 函数的重载和函数模板
- 构造函数和赋值函数的重载
- 调整vmware虚拟机硬盘空间的方法
- java 集合类Array、List、Map区别和联系
- c语言种必须掌握的四种排序方法
- ExtJS之面向对象编程基本知识
- JAVA连接MYSQL,查询 ,添加,删除,语句
- template函数和函数的重载的调用判断
- java 调用 com组件
- Java之设计模式
- JSP报表打印的一种简单解决方案
- JavaScript 事件大全
- (转)内联函数
- 最简单的delphi启动画面(转载)
- 测试一下
- web.config优化网站性能设置