读书人

自己在家看C++在函数重载方面遇到了一

发布时间: 2013-02-24 17:58:56 作者: rapoo

自己在家看C++在函数重载方面遇到了一个问题,求指教!!!!!!!!!!
#include<iostream>
using namespace std;
int add(int ,int );
float add(float,float);//double add(double,double);
void main ()
{
cout<<add(5,10)<<endl;
cout<<add(5.0,10.0)<<endl;
}
int add(int x,int y)
{
return x+y;
}
float add(float x,float y)//double add(double,double)
{
return x+y;
}
当我在VC++6.0中编译以上程序时报错“ambiguous call overloaded function”。
有书中解释说是由于数字本身并没有类型,所以在执行add(5,10);一句时,将数字5还有10
当做函数参数时,编译器会对其自动进行类型转换(称作隐式类型转换),编译器无法决定将
5以及10转换成int型还是float型,调用产生歧义,编译器无法决定执行那个add函数。
但是当我把第4行还有第14行改成注释中的内容之后,却能正确的编译运行通过。
求大神指条明路这是为什么?隐式转换的规则是怎样的?(ps本人穷学生一个,在csdn上注册没多久没有多少分能给......) c++ 编译器
[解决办法]
你原来的版本要用add(0.5f, 10.0f)
[解决办法]

引用:
你原来的版本要用add(0.5f, 10.0f)

++
10.0这个数字常量的类型是double的.

[解决办法]
cout<<add(5.0,10.0)<<endl;

其实5.0和10.0是double类型的,相当于add(double, double),
这时候重载匹配不知道匹配哪个函数,就会出现问题,
你也可以定义:
float f1=5.0, f2=10.0;
cout<<add(f1,f2)<<endl;

[解决办法]
推荐你一本书《C++ Primer》,里面讲的语法规则很好。
因为5.0,10.0像这种直接常量 C++认为是double型,比如 float a = 2.3; 其实编译系统会产生警告信息的。但如果你这样写 float a = 2.3f; 这样编译系统就认为2.3以float编码的。所以你写的代码会产生歧义,因为double 转int 、float 都为精度丢失的。所以编译系统也不知道转哪个好。

读书人网 >C++

热点推荐