当我将编译器版本从gcc 4.6切换到gcc 4.8时,我会得到以下错误:重载的“isnan(Double)”调用是不明确的。
这是因为在c++11中有不同的函数声明: C: isnan(double) C++11: bool (Double)
来自cpluplus
我怎么才能解决这个问题?
发布于 2014-04-18 08:25:54
虽然您可以通过不到处说using namespace std;来缓解这个问题,但是可以通过明确地使用std::isnan来避免它。
#include <cmath>
#include <iostream>
int main()
{
double x = ....;
std::cout << std::boolalpha;
std::cout << std::isnan(x) << std::endl;
}发布于 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中,而存在于它们上的函数中。
https://stackoverflow.com/questions/19022561
复制相似问题