2013-09-26 5 views
12

Когда я переключаю версию компилятора из gcc 4.6 в gcc 4.8, я получаю следующую ошибку: ошибка: вызов перегруженного «isnan (double)» неоднозначен.porting isnan to C++ 11

Это потому, что в C++ 11 есть differend объявления функций: C: INT IsNaN (двойной) C++ 11: BOOL IsNaN (двойной)

от cpluplus:

  • В C это выполняется как макрос, который возвращает значение int. Тип x должен быть плавающим, двойным или длинным двойным.
  • В C++ он реализован с перегрузками функций для каждого типа с плавающей запятой, каждый из которых возвращает значение bool.

Как это исправить?

+1

Как вы называете это? Покажите нам контекст. –

+0

juanchoupanza предложение работал. Я ранее использовал пространство имен std, но мне все равно пришлось добавлять его к вызову isnan, потому что это был источник неоднозначности. –

+16

Это именно то, что не так с 'use namespace 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

Этот подход, безусловно, будет работать, но не удастся удалить «использование пространства имен std» в большой базе кода, так как может потребоваться слишком много изменений. – wazza

+0

@wazza Это будет более уместно, чем оставить код сломанным. 'using namespace std;' - рецепт проблемы. Я думаю, что время, потраченное на очищение от кода, хорошо потрачено. – juanchopanza