12

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

这是因为在 c++11 中有不同的函数声明: C: int isnan(double) C++11: bool isnan(double)

来自cplus

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

我怎样才能解决这个问题?

4

2 回答 2

14

虽然你可以通过不using namespace std;到处说来缓解这个问题,但你可以通过明确使用来避免它std::isnan

#include <cmath>
#include <iostream>

int main()
{
  double x = ....;
  std::cout << std::boolalpha;
  std::cout << std::isnan(x) << std::endl;
}
于 2014-04-18T08:25:54.480 回答
2

在 C++11 中,C 和 C++ isnan 函数之间不应有歧义。它按预期工作,即使使用using namespace std.

请检查您没有同时执行#include <math.h>#include <cmath>。仅包括 cmath。

或者,也许您在项目中的某个地方有一个用户定义的isnan(double)函数,或者某些标头包含“math.h”。

另请注意,如果想要编写通用代码,在数学函数上使用“std::”前缀是不正确的,因为它会破坏参数相关查找 (ADL)。(因为 C++ 标准不允许在 std:: 命名空间中注入函数)

isnan然后,在通用代码中正确使用 forusing std::isnan;isnan在变量上使用。否则,您的代码具有用户定义的浮点类型(例如任意精度、自动微分等)将无法正常工作。这种不一致的根源在于,诸如此类的内置类型double不驻留在名称空间中,std但对它们进行操作的函数却驻留在名称空间中。

于 2019-05-22T10:10:15.020 回答