2016-03-27 7 views
-1

я следующий код:Использование IsNaN в функции шаблона

template<int FORMAT> 
    int double_to_bulk(double value, 
         char* buf, 
         double max_num, 
         int* state = NULL) 
    { 
    if (isnan(value)) 
    { 
     //Something to do 
     return 1; 
    } 
    //Something more to do 
    } 

и странные ошибки компиляции:

myfile.h: In function ‘int double_to_bulk(double, char*, double, int*)’:

myfile.h:351: error: there are no arguments to ‘isnan’ that depend on a template parameter, so a declaration of ‘isnan’ must be available

myfile.h:351: error: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)

Но я действительно не хочу, чтобы использовать -fpermissive

Я использую gcc 4.1.2, довольно старый, но ничего общего с этим. Почему в функции шаблона используется проблема isnan?

+0

в C99 она существует как макросы. И да, это было просто не определено. Меня просто смутило такое странное сообщение компилятора. – Arkady

ответ

1

Похоже, что у вас нет доступного определения для isnan. Вы включили в свой источник соответствующий заголовочный файл, где определено значение isnan? Кажется, что ничто здесь не зависит от вашего параметра шаблона.

+0

Да, переключение его на другую функцию показывает, что оно не определено. Я просто был смущен таким сообщением компилятора. – Arkady

0

Добавление строки #include<cmath> должно устранить проблему.

Если какие-либо аргументы зависели от параметра шаблона (например, если один из аргументов имел тип параметра шаблона), компилятор будет проверять наличие isnan при создании экземпляра шаблона, что, вероятно, вызовет ошибку , только позже, или потенциально не на всех, если вы никогда не используете шаблон.

НЕ использовать -fpermisive, это, вероятно, просто задержать ошибку связать Время