一个C++函数重载参数类型转换的有关问题

一个C++函数重载参数类型转换的问题
代码1:
#include <iostream>
using namespace std;
void manip(int);
void manip(double);
int main(){
manip(3.14);
}

void manip(int a){
a += 2;
cout<<a<<endl;
}

void manip(double a){
a += 1;
cout<<a<<endl;
}


运行正确,得结果:4.14

代码2:
#include <iostream>
using namespace std;
void manip(int);
void manip(float);
int main(){
manip(3.14);
}

void manip(int a){
a += 2;
cout<<a<<endl;
}

void manip(float a){
a += 1;
cout<<a<<endl;
}


运行则出错:
错误信息:
1>------ 已启动生成: 项目: pause_test, 配置: Debug Win32 ------
1>正在编译...
1>pause_test.cpp
1>e:\程序练习\cpprimer\pause_test\pause_test\pause_test.cpp(6) : error C2668: “manip”: 对重载函数的调用不明确
1>        e:\程序练习\cpprimer\pause_test\pause_test\pause_test.cpp(4): 可能是“void manip(float)”
1>        e:\程序练习\cpprimer\pause_test\pause_test\pause_test.cpp(3): 或       “void manip(int)”
1>        试图匹配参数列表“(double)”时
1>生成日志保存在“file://e:\程序练习\CPPrimer\pause_test\pause_test\Debug\BuildLog.htm”
1>pause_test - 1 个错误,0 个警告
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========


请教高手,这是为什么呢?

------解决方案--------------------
楼主还请买本《C++ primer》,里面的关于函数重载判决的章节,有极详细的解答。
------解决方案--------------------
字面常量3.14的类型是double型的
你用double的实参调用这两个函数都需要隐式类型转换,并且这两个函数成了可调用函数,所以会有冲突啊。
------解决方案--------------------
3.14是double类型的,从double到int及从double到float都属于标准转换,无法从可行函数中选出最佳匹配函数,因此产生二义。
------解决方案--------------------
3.14f 。记得如果往重载里传,一定别随手写数字。哪怕float f = 3.14.再调都可以
------解决方案--------------------
2、3、4楼正解,结贴散分吧
------解决方案--------------------
引用:
3.14f 。记得如果往重载里传,一定别随手写数字。哪怕float f = 3.14.再调都可以


确实无法区分,因为,float保存为4个字节,int也是4个字节,你调用的时候manip(3.14),编译器无法正确解释3.14(反正都是01的组合)

你可以使用下面的方法调用
manip((float)3.14);//用float明确指定类型
------解决方案--------------------
引用:
3.14是double类型的,从double到int及从double到float都属于标准转换,无法从可行函数中选出最佳匹配函数,因此产生二义。

++