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)'
string::size()
返回 size_t
,并且 sqrt
在任何版本中都不接受它。所以编译器必须进行强制转换,并且不能选择什么 - 所有这些都可以。你必须明确地进行强制转换:
maxy = (int)sqrt((double)aux.size());
问题是,在 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
可能没问题。
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
。
尝试将 aux.size() 转换为其中一种类型,这样它就不会含糊不清...