У меня есть следующий код:
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: в функции int double_to_bulk (double, char *, double,
INT *)»:myfile.h: 351: ошибка: нет аргументов для «isnan», которые
зависит от параметра шаблона, поэтому объявление ‘isnan’ должно быть
имеется в наличииmyfile.h: 351: ошибка: (если вы используете «-fpermissive», G ++ будет
принять ваш код, но разрешить использование необъявленного имени
устаревшее)
Но я действительно не хочу использовать -fpermissive
я использую gcc 4.1.2
, довольно старый, но ничего общего с этим. Почему это проблема для использования isnan
в шаблонной функции?
Похоже, у вас нет доступного определения для isnan
, Вы включили в свой источник соответствующий файл заголовка, где isnan
определено? Кажется, здесь вообще ничего не зависит от параметра вашего шаблона.
Добавление строки #include<cmath>
должен решить проблему.
Если какие-либо аргументы зависели от параметра шаблона (например, если один из аргументов имел тип параметра шаблона), компилятор будет проверять только наличие isnan
когда вы создаете экземпляр шаблона, который, вероятно, в любом случае вызовет ошибку, чуть позже или, возможно, вообще не будет, если вы никогда не будете использовать шаблон.
Не использовать -fpermisive
, это, вероятно, просто задержит ошибку, чтобы связать время