首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将isnan移植到c++11

将isnan移植到c++11
EN

Stack Overflow用户
提问于 2013-09-26 08:01:22
回答 2查看 6.6K关注 0票数 12

当我将编译器版本从gcc 4.6切换到gcc 4.8时,我会得到以下错误:重载的“isnan(Double)”调用是不明确的。

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

来自cpluplus

  • 在C中,这是作为返回int值的宏实现的。X的类型是浮动的,双倍的或长的双倍的。
  • 在C++中,它是用函数重载来实现的,每个浮点类型都返回一个bool值。

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

EN

回答 2

Stack Overflow用户

发布于 2014-04-18 08:25:54

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

代码语言:javascript
复制
#include <cmath>
#include <iostream>

int main()
{
  double x = ....;
  std::cout << std::boolalpha;
  std::cout << std::isnan(x) << std::endl;
}
票数 14
EN

Stack Overflow用户

发布于 2019-05-22 10:10:15

在C++11中,C函数和C++ isnan函数之间不应该存在歧义。它如预期的那样工作,即使在using namespace std中也是如此。

请检查您是,而不是,同时执行#include <math.h>#include <cmath>。只包括数学。

或者,您可能在项目中有一个用户定义的isnan(double)函数,或者某个标头包含"math.h“。

还请注意,如果要编写泛型代码,在数学函数中使用'std::‘前缀是不正确的,因为它破坏了参数依赖查找(ADL)。(因为C++标准不允许在std::命名空间中注入函数)

泛型代码中isnan的正确用法是using std::isnan;,然后在变量上只使用isnan。否则,您的代码与用户定义的浮点类型,如任意精度,自动区分等将无法工作。这种不一致性的根源在于,内置类型(如double )并不驻留在名称空间std中,而存在于它们上的函数中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19022561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档