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在这里施展可能很好.