2012-02-14 59 views
3

隨着4.2.1 G ++編譯器,我得到以下錯誤:C++ CMATH戰俘存在於舊版本的編譯器,而不是在錯誤的較新的一個

functions.cpp:24: error: call of overloaded ‘pow(long int&, long int&)’ is ambiguous 
/usr/include/architecture/i386/math.h:343: note: candidates are: double pow(double, double) 
/usr/include/c++/4.2.1/cmath:373: note:     long double std::pow(long double, int) 
/usr/include/c++/4.2.1/cmath:369: note:     float std::pow(float, int) 
/usr/include/c++/4.2.1/cmath:365: note:     double std::pow(double, int) 
/usr/include/c++/4.2.1/cmath:361: note:     long double std::pow(long double, long double) 
/usr/include/c++/4.2.1/cmath:357: note:     float std::pow(float, float) 

這裏的負責代碼:

long power(long a, long b) { 
    if (b < 0) return 0; 
    return pow(a,b); 
} 

但是,在我的4.6.1版本中,我沒有錯誤,也沒有警告我的代碼,我使用兩個long進行pow評估(即使使用-Wextra標誌)。 這是爲什麼?並且在使用pow函數時使用了兩個長整數是我的錯誤?

+0

看起來像4.6添加了'pow(long,long)'作爲擴展 – Anycorn 2012-02-14 09:00:36

+0

標準說它應該是double http://pubs.opengroup.org/onlinepubs/9699919799/functions/pow.html所以我認爲as只要你堅持這個標準,你就可以做演員。 – INS 2012-02-14 09:01:00

+0

Anycorn,你能否提供一個參考(把它作爲答案) – 2012-02-14 09:02:13

回答

2

問題是沒有定義pow需要兩個long參數。因此,多頭會被轉換爲其他數據類型,但這種轉換會導致模糊,因爲轉換可能發生的方式很多。 gcc不知道如何解釋這個調用,所以它會給你一個錯誤。

+0

我明白這一點。但爲什麼在舊版本的編譯器中出現問題,而不是在新版本上? – 2012-02-14 08:59:24

+0

這可能是新版本將調用映射到兼容方法。例如,它可能有一些用於類型轉換的約定。它可能會把多頭變成雙打,這樣就不會失去精確度。 – Pochi 2012-02-14 09:02:41

2

據我所知,pow未被證實支持long, long作爲ANSI的參數。請考慮使用雙倍(或強制轉換),如果需要,結果如下:

long int result = llround(pow((double)2L, (double)4L)); 
1

Pow只支持double和long。 也許在較新的版本中,他們添加了一個隱含的強制轉換,使其從long開始加倍。這是我能想到的最好的。 我還沒有聽說延長支持長期在戰俘!

相關問題