2013-09-26 14 views
12

Kiedy przełączam wersję kompilatora z gcc 4.6 na gcc 4.8 pojawia się następujący błąd błąd: wywołanie przeciążonego 'isnan (double)' jest niejednoznaczne.portowanie isnan do C++ 11

To dlatego, C++ 11 są zgłoszeń funkcyjne różniły: C int isnan (podwójne) C++ 11: BOOL isnan (podwójne)

z cpluplus:

  • W języku C jest to zaimplementowane jako makro zwracające wartość int. Typ x powinien być zmienny, podwójny lub długi podwójny.
  • W języku C++ implementowane jest ono z przeciążeniami funkcji dla każdego typu zmiennoprzecinkowego, z których każdy zwraca wartość bool.

Jak mogę to naprawić?

+1

Jak dzwonisz to? Pokaż nam kontekst. –

+0

sugestia juanchoupanza zadziałała. Ogłosiłem wcześniej używanie przestarzałej przestrzeni nazw, ale i tak musiałem ją poprzedzać, ponieważ było źródłem niejednoznaczności. –

+16

To jest dokładnie to, co jest nie tak z "use namespace std' wszędzie. –

Odpowiedz

13

Chociaż można złagodzić ten problem, nie mówiąc using namespace std; wszędzie można go uniknąć, będąc wyraźnie o użyciu std::isnan:

#include <cmath> 
#include <iostream> 

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

To podejście na pewno zadziała, ale nie będzie właściwe usuwanie "używania przestrzeni nazw standardowej" w dużej bazie kodu, ponieważ może wymagać zbyt wielu zmian. – wazza

+0

@wazza Będzie to bardziej odpowiednie niż pozostawienie złamanego kodu. 'using namespace std;' jest receptą na kłopoty. Myślę, że czas spędzony na oczyszczeniu go z kodu to czas dobrze spędzony. – juanchopanza