string aux;
int maxy,auxx=0;
cin>>aux;
maxy= (int)sqrt(aux.size());
我得到了:
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)'
为什么?
答案 0 :(得分:32)
string::size()
返回size_t
,sqrt
不接受任何版本。所以编译器必须强制转换,而不能选择什么 - 所有这些都可以。你必须放置显式的演员:
maxy = (int)sqrt((double)aux.size());
答案 1 :(得分:11)
问题在于,在C ++中,有三个名为sqrt
的函数 - 一个考虑float
,一个考虑double
,一个考虑long double
。当你试着打电话
sqrt(aux.size());
编译器尝试确定您要调用哪些函数。由于aux.size()
会返回string::size_type
,float
,double
和long double
,它会尝试查看string::size_type
是否可以隐式兑换这三个中的任何一个。但由于string::size_type
可以转换为所有这三种类型,因此编译器会将调用标记为含糊不清,因为您不清楚要执行哪些转换。
要解决此问题,您可以将aux.size()
显式转换为所需的类型。例如:
sqrt(double(aux.size()));
或
sqrt(float(aux.size()));
这使得调用明确地匹配两个函数之一。根据您需要的精度,您可以选择三个重载中的任何一个。由于你只是回到了int
,所以在这里投射到float
可能很好。
答案 2 :(得分:1)
aux.size()
会返回std::size_t
,但sqrt()
没有带有std::size_t
参数的重载版本。
编译器报告sqrt
有3个重载:它带有float
,double
和long double
个参数。 std::size_t
可以转换为其中任何一个,因此存在歧义,因为编译器不知道是否要将std::size_t
转换为float
或double
或long double
答案 3 :(得分:0)
尝试将你的aux.size()转换为其中一种类型,这样就不会有歧义......