2013-09-26 8 views
12

Wenn ich die Compiler-Version von gcc 4.6 zu gcc 4.8 umschalten bekomme ich den folgenden Fehler Fehler: Aufruf von überladenen 'Isnan (double)' ist mehrdeutig.Portierung Isnan zu C++ 11

Dies liegt daran, dass in C++ 11 gibt differend Funktionsdeklarationen sind: C: int isnan (double) C++ 11: bool isnan (double)

von cpluplus:

  • In C wird dies als Makro implementiert, das einen int-Wert zurückgibt. Die Art von x soll float, double oder long double sein.
  • In C++ ist es mit Funktionsüberladungen für jeden Gleitkommatyp implementiert, die jeweils einen Bool-Wert zurückgeben.

Wie kann ich das beheben?

+1

Wie Sie es nennend? Zeigen Sie uns den Kontext. –

+0

Juanchoupanza Vorschlag arbeitete. Ich hatte zuvor deklariert, namespace std zu verwenden, aber ich musste es trotzdem dem isnan-Aufruf voranstellen, weil es eine Quelle der Mehrdeutigkeit war. –

+16

Genau das ist falsch bei 'namespace std überall verwenden '. –

Antwort

13

Obwohl Sie dieses Problem mildern, indem nicht using namespace std; überall sagen, können Sie es vermeiden, indem sie explizit zu werden über std::isnan mit:

#include <cmath> 
#include <iostream> 

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

Dieser Ansatz wird sicherlich funktionieren, aber es wird nicht angemessen sein, "using namespace std" in einer großen Codebasis zu entfernen, da es möglicherweise zu viele Änderungen benötigt. – wazza

+0

@wazza Es wird angemessener sein, als den Code zu verlassen. 'using namespace std;' ist ein Rezept für Probleme. Ich denke, die Zeit, die wir damit verbringen, es aus dem Code zu entfernen, ist eine gute Zeit. – juanchopanza