传递 size_t 时对重载 sqrt 函数的不明确调用

问题描述 投票:0回答:4
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)'
c++ overloading overload-resolution
4个回答
33
投票

string::size()
返回
size_t
,并且
sqrt
在任何版本中都不接受它。所以编译器必须进行强制转换,并且不能选择什么 - 所有这些都可以。你必须明确地进行强制转换:

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

14
投票

问题是,在 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
可能没问题。


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


-1
投票

尝试将 aux.size() 转换为其中一种类型,这样它就不会含糊不清...

© www.soinside.com 2019 - 2024. All rights reserved.