我在C ++中创建了一个简单的代码
#include<math.h>
void main()
{
float a,x;
cout<<"Enter value of a"<<endl;
cin>>a;
x = pow(a,0.5);
cout<<x;
}
但它给了我错误:
当我按F12并转到pow()的定义时,会发现这6个重载:
正如我们所看到的,它显然有一个重载(double,double)和一个for(float,float),所以为什么当我将'a'声明为float并且在我更改其数据时工作正常时会出错-type到'b'?
答案 0 :(得分:8)
这里的问题是文字0.5
是double
,因此您使用一组参数调用pow
,这些参数不能明确地匹配重载,以及哪种类型的转换不能应用于明确匹配现有的重载。您应该使用float literal 0.5f
代替。
x = pow(a, 0.5f);
另请注意,#include <iostream>
,cout
和cin
需要endl
,您必须以全名引用它们({{1} },std::cout
,std::cin
),或使用声明
std::endl
最后,using std::cout;
using std::cin;
using std::endl;
不是void main()
函数的有效签名之一。它必须返回int,所以
main
或
int main()
答案 1 :(得分:3)
您使用float
和double
进行调用。这种组合没有超载,而且有些组合足够模糊。
0.5f
参数的重载,则 float
会有float
类型。
答案 2 :(得分:2)
您需要显式调用pow()
x = pow(a, 0.5f);
或
double y = pow(static_cast<double>(a), 0.5);
答案 3 :(得分:2)
您的通话完全与pow
的各种定义完全匹配,因此编译器正在尝试查看它是否可以自动转换您的某些参数以便它完全匹配,但这里有6个可能匹配的pow
定义。您需要告诉编译器您想要哪一个。
您尝试调用的是pow(float, double)
,因为0.5是双字面值(不一个浮点数!)。
如果您执行pow(a, 0.5f)
示例,那么两个参数都是float,它将进行编译。当然你也可以选择其他5个重载中的任何一个。