2013-09-26 5 views
12

Lorsque je change la version du compilateur de gcc 4.6 à gcc 4.8, j'obtiens l'erreur suivante erreur: l'appel de 'isnan (double) surchargé' est ambigu.portage isnan à C++ 11

En effet, dans C++ 11 il y a des déclarations de fonction differend: C: int isnan (double) C++ 11: bool isnan (double)

de cpluplus:

  • En C, ceci est implémenté comme une macro qui renvoie une valeur int. Le type de x doit être flottant, double ou long double.
  • En C++, il est implémenté avec des surcharges de fonction pour chaque type à virgule flottante, chacune renvoyant une valeur booléenne.

Comment puis-je résoudre ce problème?

+1

Comment allez-vous l'appeler? Montrez-nous le contexte. –

+0

suggestion de juanchoupanza travaillé. J'avais déclaré utiliser l'espace de noms std auparavant, mais je devais le préfixer de toute façon à l'appel isnan parce que c'était une source d'ambiguïté. –

+16

C'est exactement ce qui ne va pas avec 'use namespace std' partout. –

Répondre

13

Bien que vous pouvez atténuer ce problème en ne disant pas using namespace std; partout, vous pouvez l'éviter en étant explicite sur l'utilisation std::isnan:

#include <cmath> 
#include <iostream> 

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

Cette approche fonctionnera sûrement, mais il ne sera pas approprié de supprimer "using namespace std" dans une grande base de code car cela peut nécessiter trop de changements. – wazza

+0

@wazza Ce sera plus approprié que de laisser le code brisé. 'using namespace std;' est une recette pour le problème. Je pense que le temps passé à le purger du code est du temps bien dépensé. – juanchopanza