2013-09-26 161 views
12

當我將編譯器版本從gcc 4.6切換到gcc 4.8時,出現以下錯誤 錯誤:重載的'isnan(double)'調用不明確。將isnan移植到C++ 11

這是因爲在C++ 11有differend函數聲明: C:INT isnan(雙) C++ 11:布爾isnan(雙)

cpluplus

  • 在C中,這被實現爲一個返回int值的宏。 x的類型應爲float,double或long double。
  • 在C++中,它針對每個浮點類型都實現了函數重載,每個都返回一個bool值。

我該如何解決這個問題?

+1

你怎麼叫它?向我們展示上下文。 –

+0

juanchoupanza建議工作。我之前已經聲明過使用名稱空間,但是我不得不將它預先添加到isnan調用中,因爲它是模糊性的來源。 –

+16

這正是'使用命名空間std'到處都是什麼問題。 –

回答

13

雖然可以減輕由不是說using namespace std;隨處可見這個問題,你可以通過被明確避免關於使用std::isnan

#include <cmath> 
#include <iostream> 

int main() 
{ 
    double x = ....; 
    std::cout << std::boolalpha; 
    std::cout << std::isnan(x) << std::endl; 
} 
+0

這種方法肯定會起作用,但不適合在大型代碼庫中刪除「using namespace std」,因爲它可能需要太多更改。 – wazza

+0

@wazza這會比讓代碼破碎更合適。 '使用名稱空間標準;'是一個麻煩的祕訣。我認爲花費時間從代碼中清除它花費了很多時間。 – juanchopanza