关于pow函数疑问
在VC2008里面我已知pow的参数类型是double于是我给了pow两个参数:
pow(2.0, 4.0); //编译通过
pow(2, 4); //编译失败
pow(2.0, 4); //编译成功
pow(2, 4.0); //编译成功
inline float __CRTDECL pow(_In_ float _X, _In_ float _Y){return (powf(_X, _Y)); }inline float __CRTDECL pow(_In_ float _X, _In_ int _Y){return (_Pow_int(_X, _Y)); }inline long double __CRTDECL pow(_In_ long double _X, _In_ long double _Y){return (powl(_X, _Y)); }inline long double __CRTDECL pow(_In_ long double _X, _In_ int _Y){return (_Pow_int(_X, _Y)); }inline double __CRTDECL pow(_In_ double _X, _In_ int _Y){return (_Pow_int(_X, _Y)); }
[解决办法]
去看看pow的类型,double float等,int貌似不支持,得类型转换
[解决办法]
pow(2.0f, 4.0f); //调用是pow(float, float)
pow(2.0, 4.0); //调用pow(double, double)
pow(2, 4.0); // pow(double, double)
pow(2.0, 4); // pow(double, int)
[解决办法]
int是会隐形转换成double型,看看你是不是有重载方面,或者其他方面出问题了。
[解决办法]
类型的问题 重载类型不明确 你需要指定调用那个重载类型
[解决办法]
首先,编译器是按照如下方式确定调用哪个重载函数的:
1.是确定该调用中所考虑的重载函数的集合,该函数集合被称为候选函数(candidant function)。所谓候选函数就是与被调用函数同名的函数。
2.选出的候选函数中调出可行函数(viable function)。可行函数的函数参数个数与调用的函数参数个数相同,或者可行函数的参数可以多一些,但是多出来的函数参数都要有相关的缺省值
3.是根据参数类型的转换规则将被调用的函数实参转换(conversion)成候选函数的实参。这里本着充分利用参数类型转换的原则,换句话说,尽可能的使用上参数类型转换。当然转换要以候选函数为转换的目标。如果依照参数转换规则没有找到可行函数,则该调用就是错误的,则说没有函数与调用匹配,属于无匹配情况(no match function)。
4.从选出的可行函数中选出最佳可行函数(best match situation)。在最佳可行函数的选择中,从函数实参类型到相应可行函数参数所用的转化都要划分等级,根据等级的划分(ranked),最后选出最佳可行函数。此时,如果有多个最佳可行函数,将编译错误~