C++编译器错误:对重载函数的模糊调用

and*_*and 18 c++

string aux;
int maxy,auxx=0;

cin>>aux;

maxy= (int)sqrt(aux.size());
Run Code Online (Sandbox Code Playgroud)

我在说:

1> error C2668: 'sqrt' : ambiguous call to overloaded function
1>        could be 'long double sqrt(long double)'
1>        or       'float sqrt(float)'
1>        or       'double sqrt(double)'
Run Code Online (Sandbox Code Playgroud)

为什么?

lit*_*adv 32

string::size()返回size_t,并且sqrt不接受任何版本.所以编译器必须强制转换,而不能选择什么 - 所有这些都可以.你必须把显式演员:

maxy = (int)sqrt((double)aux.size());
Run Code Online (Sandbox Code Playgroud)


tem*_*def 11

问题是在C++中,有三个命名的函数sqrt- 一个接受a float,一个接受a double,一个接受a long double.当你试着打电话

sqrt(aux.size());
Run Code Online (Sandbox Code Playgroud)

编译器尝试确定您要调用哪些函数.因为aux.size()返回a string::size_type既不是a float,double也不是long double,它试图查看是否string::size_type可以隐式转换为这三者中的任何一个.但由于string::size_type可以转换为所有这三种类型,编译器会将调用标记为含糊不清,因为您不清楚要执行哪些转换.

要解决此问题,您可以显式转换aux.size()为所需的类型.例如:

sqrt(double(aux.size()));
Run Code Online (Sandbox Code Playgroud)

要么

sqrt(float(aux.size()));
Run Code Online (Sandbox Code Playgroud)

这使得调用明确地匹配两个函数之一.根据您需要的精度,您可以选择三个重载中的任何一个.因为你只是回到了一个int,所以float在这里施展可能很好.