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

时间:2011-06-03 22:06:12

标签: c++

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)'

为什么?

4 个答案:

答案 0 :(得分:32)

string::size()返回size_tsqrt不接受任何版本。所以编译器必须强制转换,而不能选择什么 - 所有这些都可以。你必须放置显式的演员:

maxy = (int)sqrt((double)aux.size());

答案 1 :(得分:11)

问题在于,在C ++中,有三个名为sqrt的函数 - 一个考虑float,一个考虑double,一个考虑long double。当你试着打电话

sqrt(aux.size());

编译器尝试确定您要调用哪些函数。由于aux.size()会返回string::size_typefloatdoublelong 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个重载:它带有floatdoublelong double个参数。 std::size_t可以转换为其中任何一个,因此存在歧义,因为编译器不知道是否要将std::size_t转换为floatdoublelong double

答案 3 :(得分:0)

尝试将你的aux.size()转换为其中一种类型,这样就不会有歧义......