【问题标题】:Using isnan in template function在模板函数中使用 isnan
【发布时间】:2016-03-27 13:24:06
【问题描述】:

我有以下代码:

  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: error: (如果你使用'-fpermissive',G++ 会 接受您的代码,但允许使用未声明的名称 已弃用)

但是我真的不想用-fpermissive

我使用gcc 4.1.2,相当老,但与它无关。为什么在模板函数中使用isnan会出现问题?

【问题讨论】:

  • 在 C99 中它以宏的形式存在。是的,它根本没有定义。我只是被这种奇怪的编译器消息弄糊涂了。

标签: c++ templates macros gcc4


【解决方案1】:

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

【讨论】:

  • 是的,将它移到另一个函数表明它没有定义。我只是被编译器的这种信息弄糊涂了。
【解决方案2】:

添加行 #include&lt;cmath&gt; 应该可以解决问题。

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

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

【讨论】:

    猜你喜欢
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 2013-05-07
    • 2018-11-06
    • 1970-01-01
    相关资源
    最近更新 更多