在模板函数

时间:2016-03-27 13:24:07

标签: c++ templates macros gcc4

我有以下代码:

  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会出现问题?

2 个答案:

答案 0 :(得分:1)

您似乎没有isnan的可用定义。您是否在源中包含了定义isnan的相应头文件?这里没有任何东西似乎取决于你的模板参数。

答案 1 :(得分:0)

添加行#include<cmath>可以解决问题。

如果任何参数确实依赖于模板参数(例如,如果其中一个参数具有模板参数类型),则编译器将仅在您实例化模板时检查是否存在isnan,这可能会导致无论如何,只是在一个错误,或者如果你从不使用模板,可能根本就没有错误。

不要使用-fpermisive,它可能只是将错误延迟到链接时间