2011-06-03 49 views
16
string aux; 
int maxy,auxx=0; 

cin>>aux; 

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

我在歌厅:C++编译器错误:不明确调用重载函数

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)' 

为什么?

回答

31

string::size()返回size_tsqrt不接受它的任何版本。所以编译器必须投射,而不能选择什么 - 所有这些都是好的。你必须把明确的转换:

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

的问题是,在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

“一个无与伦比的左括号创建一个尚未解决的紧张,所有的日子会陪着你” http://xkcd.com/859/这就是为什么我喜欢C-风格转换的像这样的案例 - 他们生产的嵌套层次少。 – AnT 2011-06-03 22:13:53

+0

:-)谢谢!固定。 – templatetypedef 2011-06-03 22:14:21

0

试试您铸造aux.size()来为这些类型之一,所以不会产生歧义......

1

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

编译器报告sqrt有3个过载:其中参数为float,doublelong doublestd::size_t可以转换到任何这些,所以有,因为编译器的不确定性不知道是否std::size_t转换为floatdoublelong double

相关问题