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)'
为什么?
发布于 2011-06-04 06:09:07
string::size()
返回size_t
,sqrt
在它的任何版本中都不接受它。所以编译器必须强制转换,并且不能选择是什么--所有这些都是OK的。你必须显式转换:
maxy = (int)sqrt((double)aux.size());
发布于 2011-06-04 06:09:52
问题是,在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
可能没问题。
发布于 2011-06-04 06:11:43
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
。
https://stackoverflow.com/questions/6233132
复制相似问题