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

Posted

技术标签:

【中文标题】C++ 编译器错误:对重载函数的模糊调用【英文标题】:C++ compiler error: ambiguous call to overloaded function 【发布时间】:2011-06-03 22:06:12 【问题描述】:
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)'

为什么?

【问题讨论】:

【参考方案1】:

string::size() 返回size_t,而sqrt 在其任何版本中都不接受它。所以编译器必须强制转换,并且不能选择什么 - 它们都可以。您必须进行明确的演员表:

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

【讨论】:

【参考方案2】:

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

【讨论】:

“一个无与伦比的左括号会产生一种无法解决的紧张情绪,这将伴随你一整天”xkcd.com/859这就是为什么我更喜欢这种情况下的 C 风格强制转换——它们产生的嵌套层次更少。 【参考方案3】:

aux.size() 返回一个std::size_t,但sqrt() 没有采用std::size_t 参数的重载版本。

编译器报告sqrt 有3 个重载:采用floatdoublelong double 参数。 std::size_t 可以转换为其中任何一个,因此存在歧义,因为编译器不知道是否将 std::size_t 转换为 floatdoublelong double

【讨论】:

【参考方案4】:

尝试将您的 aux.size() 转换为其中一种类型,这样就不会模棱两可了...

【讨论】:

以上是关于C++ 编译器错误:对重载函数的模糊调用的主要内容,如果未能解决你的问题,请参考以下文章

运算符重载和函数重载会产生模糊的编译器错误

Qt 5 QWebEngine 页面 printToPdf C2668 对重载函数的模糊调用

错误 C2668 从站点 http://h264bitstream.sourceforge.net/ 对重载函数代码的模糊调用

c++重载

对重载可变参数模板函数的歧义调用

C++ bool 表达式作为函数参数调用错误的重载