2015-03-03 196 views
0

我在C++C++ POW()函數錯誤

#include<math.h> 

void main() 
{ 
float a,x; 

    cout<<"Enter value of a"<<endl; 
    cin>>a; 

    x = pow(a,0.5); 
    cout<<x; 
} 

做了一個簡單的代碼,但它給我的錯誤:

Error for Pow() use with float in C++

當我按下F12,去戰俘的定義( ),這些6個重載發現:

math.h pow() overloads

正如我們可以看到的,它顯然有一個重載(double,double)和一個for(float,float),那麼爲什麼當我將'a'聲明爲float並且在更改其數據類型到'b'?

+3

問題是你傳遞了一個'float'作爲第一個參數和一個'double'作爲第二個參數,並且沒有重載匹配那個參數必須被轉換,但是編譯器不能決定哪個參數轉換爲您製作。 – 2015-03-03 13:56:41

+0

0.5可能不明確。將其修改爲0.5f,以便將其解釋爲浮點文字。 – 2015-03-03 13:57:21

+2

@LeandroVaz:0.5不含糊 - 它是'double'類型的文字。 – 2015-03-03 14:02:47

回答

8

在這裏的問題是,字面0.5double,所以你有一組不明確匹配的過載,併爲這類型的轉換不能用於明確地匹配現有的過載參數調用pow。您應該改用float literal 0.5f

x = pow(a, 0.5f); 

另外請注意,你需要#include <iostream>coutcinendl,你必須通過其全名(std::coutstd::cinstd::endl),或使用使用聲明

using std::cout; 
using std::cin; 
using std::endl; 
要麼指他們

最後,void main()不是main函數的有效簽名之一。它必須返回整型,所以

int main() 

auto main()->int 
+1

** auto main() - > int **哇,從來沒有關於像這樣聲明入口點。它使代碼看起來更像C++ – codekiddy 2015-03-03 14:00:43

+0

我已經完成了所有#include 並明顯使用命名空間std thing – 2015-03-03 14:01:22

+0

由於'int main()'是C++中最熟悉的入口點,所以我不建議使用這種形式'auto main ) - > int',它被混淆了。 – deepmax 2015-03-03 14:11:58

2

您需要顯式調用的pow()

x = pow(a, 0.5f); 

double y = pow(static_cast<double>(a), 0.5); 
3

你調用一個重載函數它與一個floatdouble。這個組合沒有超載,而且有幾個足夠接近而不明確。

0.5f將有類型float,如果你想使用兩個float參數超載。

2

無法通話正是匹配任何pow的各種定義的,所以編譯器試圖看它是否能自動轉換你的一些參數,以便將完全匹配,但這裏有6所可能的定義可以匹配的pow。你需要告訴編譯器你需要哪一個。

您試圖調用的是pow(float, double),因爲0.5是雙字面值(而不是 a float!)。

如果你這樣做例如pow(a, 0.5f)那麼這兩個參數都是浮點數並且它會被編譯。當然,你也可以選擇其他5種重載。