首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++编译器错误:对重载函数的调用不明确

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

Stack Overflow用户
提问于 2011-06-04 06:06:12
回答 4查看 55.1K关注 0票数 20
代码语言:javascript
复制
string aux;
int maxy,auxx=0;

cin>>aux;

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

我得到了:

代码语言:javascript
复制
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)'

为什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-06-04 06:09:07

string::size()返回size_tsqrt在它的任何版本中都不接受它。所以编译器必须强制转换,并且不能选择是什么--所有这些都是OK的。你必须显式转换:

代码语言:javascript
复制
maxy = (int)sqrt((double)aux.size());
票数 33
EN

Stack Overflow用户

发布于 2011-06-04 06:09:52

问题是,在C++中,有三个名为sqrt的函数-一个接受float,一个接受double,还有一个接受long double。当您尝试呼叫

代码语言:javascript
复制
sqrt(aux.size());

编译器会尝试确定您要调用这些函数中的哪些函数。由于aux.size()返回的string::size_type既不是floatdouble,也不是long double,因此它会尝试查看string::size_type是否可以隐式转换为这三种类型中的任何一种。但是,由于string::size_type可以转换为所有这三种类型,编译器会将调用标记为不明确,因为不清楚您想要执行哪种转换。

要解决此问题,可以将aux.size()显式转换为所需的类型。例如:

代码语言:javascript
复制
sqrt(double(aux.size()));

代码语言:javascript
复制
sqrt(float(aux.size()));

这使得调用明确地匹配两个函数中的一个。根据所需的精度,您可以选择三种重载中的任何一种。由于您只是转换回int,因此在这里转换为float可能没问题。

票数 13
EN

Stack Overflow用户

发布于 2011-06-04 06:11:43

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

编译器报告sqrt有3个重载:它们接受floatdoublelong double参数。std::size_t可以转换为其中的任何一个,因此存在歧义,因为编译器不知道是将std::size_t转换为floatdouble还是long double

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6233132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档