C++编译器错误:对重载函数的调用不明确

C++ compiler error: ambiguous call to overloaded function

本文关键字:函数 调用 不明确 重载 编译器 错误 C++      更新时间:2023-10-16
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,它既不是floatdouble,也不是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个重载:它们接受floatdoublelong double参数。std::size_t可以转换为任何一个,因此存在歧义,因为编译器不知道是将std::size_t转换为float,还是将doublelong double

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