2013-09-26 225 views
12

当我将编译器版本从gcc 4.6切换到gcc 4.8时,出现以下错误 错误:重载的'isnan(double)'调用不明确。将isnan移植到C++ 11

这是因为在C++ 11有differend函数声明: C:INT isnan(双) C++ 11:布尔isnan(双)

cpluplus

  • 在C中,这被实现为一个返回int值的宏。 x的类型应为float,double或long double。
  • 在C++中,它针对每个浮点类型都实现了函数重载,每个都返回一个bool值。

我该如何解决这个问题?

+1

你怎么叫它?向我们展示上下文。 –

+0

juanchoupanza建议工作。我之前已经声明过使用名称空间,但是我不得不将它预先添加到isnan调用中,因为它是模糊性的来源。 –

+16

这正是'使用命名空间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

这种方法肯定会起作用,但不适合在大型代码库中删除“using namespace std”,因为它可能需要太多更改。 – wazza

+0

@wazza这会比让代码破碎更合适。 '使用名称空间标准;'是一个麻烦的秘诀。我认为花费时间从代码中清除它花费了很多时间。 – juanchopanza