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
,它既不是float
、double
也不是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 个重载:采用float
、double
和long double
参数。 std::size_t
可以转换为其中任何一个,因此存在歧义,因为编译器不知道是否将 std::size_t
转换为 float
或 double
或 long double
。
【讨论】:
【参考方案4】:尝试将您的 aux.size() 转换为其中一种类型,这样就不会模棱两可了...
【讨论】:
以上是关于C++ 编译器错误:对重载函数的模糊调用的主要内容,如果未能解决你的问题,请参考以下文章
Qt 5 QWebEngine 页面 printToPdf C2668 对重载函数的模糊调用
错误 C2668 从站点 http://h264bitstream.sourceforge.net/ 对重载函数代码的模糊调用