为什么这里有错误?
#include <iostream>
#include <math.h>
#include <vector>
#include <ostream>
using namespace std;
struct Point {
int x,y;
};
int distance (const Point& a,const Point& b){
int k= sqrt(((a.x-b.x)*(a.x-b.x))+((a.y-b.y)*(a.y-b.y)));
}
int main(){
return 0;
}
构建输出:
1>------ Build started: Project: distance, Configuration: Debug Win32 ------
1> distance.cpp
1>d:\...\distance.cpp(13): error C2668: 'sqrt' : ambiguous call to overloaded function
1> c:\...\vc\include\math.h(589): could be 'long double sqrt(long double)'
1> c:\...\vc\include\math.h(541): or 'float sqrt(float)'
1> c:\...\vc\include\math.h(127): or 'double sqrt(double)'
1> while trying to match the argument list '(const int)'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
答案 0 :(得分:4)
sqrt需要一个double(显然是你编译器中的各种不同的双精度数) - 你传递的是一个int
只做sqrt((double)....)
确定 - 更确切地说,sqrt()必须采用浮点数 - 浮点数或双精度数。由于各种历史原因,它通常能够在不同的浮点类型之间进行转换。执行sqrt计算的CPU位可能(假设为x86)以80位进行计算,既不是float也不是double /
答案 1 :(得分:4)
这应该有效
float k= sqrt((float)((a.x-b.x)*(a.x-b.x))+((a.y-b.y)*(a.y-b.y)));
sqrt()不将int作为参数。
答案 2 :(得分:4)
你不能取整数的sqrt。它需要是一个浮点数。
你需要做这样的事情:
int k= (int)sqrt((double)((a.x-b.x)*(a.x-b.x))+((a.y-b.y)*(a.y-b.y)));
(double)会将int转换为double,然后(int)将其转换回int。您还应该考虑是否要始终如一地使用双打。
答案 3 :(得分:4)
sqrt
有三个重载,它们采用不同的参数:float sqrt(float)
,double sqrt(double)
和long double sqrt(long double)
。您可以在编译器输出中看到这些。
如果使用整数参数(例如sqrt
)调用sqrt(9)
,则可以将整数强制转换为这三种类型中的任何。那么应该调用哪个函数?编译器不知道。这是不明确的,所以你得到一个错误迫使你明确选择你想要的重载。只需转换参数以匹配其中一个重载:sqrt(static_cast<float>(((a.x-b.x)*(a.x-b.x))+((a.y-b.y)*(a.y-b.y)))
。
答案 4 :(得分:0)
有三种sqrt方法:一种采用long,一种采用float,另一种采用double值。
尝试
int k= (int)sqrt((double)(((a.x-b.x)*(a.x-b.x))+((a.y-b.y)*(a.y-b.y))));
告诉编译器您要使用双版本然后转换回int。
答案 5 :(得分:0)
您实际上已将int
传递给sqrt
,该float
只接受double
,long double
或sqrt
类型的参数。此外,int
不会返回float k = sqrt((float)(...));
float k = sqrt(static_cast<float>(...));
。编译器无法猜测要进行的类型转换,因此您必须自己使用C风格的转换或“新风格”转换来强制转换:
{{1}}
另外,正确缩进代码;它使阅读更容易。