1. 程式人生 > >解決“sqrt”: 對過載函式的呼叫不明確

解決“sqrt”: 對過載函式的呼叫不明確

也是自己平時總結出來,希望可以對小白有幫助。高手勿噴。

假如原先是這樣的:if (sqrt((x0-tx)*(x0-tx)+(y0-ty)*(y0-ty))<r0) //其中引數都是int
執行程式時出現下述錯誤:
error C2668: “sqrt”: 對過載函式的呼叫不明確
1>        d:\vs2010\vc\include\math.h(581): 可能是“long double sqrt(long double)”
1>        d:\vs2010\vc\include\math.h(533): 或       “float sqrt(float)”
1>        d:\vs2010\vc\include\math.h(128): 或       “double sqrt(double)”
1>        試圖匹配引數列表“(int)”時
原因是程式從VC6.0轉到VS.net更高版本上執行,因為VS.net要求的更精確而造成了報錯
修改:在math.h中"sqrt"有三種類型 :long double sqrt(long double ),float sqrt(float),
double sqrt(double),所以任選一種對你的應用精度較好的引數和返回值型別,如float sqrt(float),將上述
if (sqrt((x0-tx)*(x0-tx)+(y0-ty)*(y0-ty))<r0)修改為:
if ((float sqrt((x0-tx)*(x0-tx)+(y0-ty)*(y0-ty)))<r0)即可(執行成功)

以上這段是網上別人寫的,但是我按照他這個還是不行。後來修改了地方,在引數上加上轉換

即int diagonal = floor(sqrt((double)img.rows*(double)img.rows + (double)img.cols*(double)img.cols));(這是我執行的其中一部分的程式碼)

就可以成功運行了。