如何解决“fpclassify”:对重载函数的模糊调用

How to resolve "fpclassify': ambiguous call to overloaded function

我是 C++ 的新手。我被赋予了安装模拟的任务,但我将 运行 保留为错误代码。我能够解决大部分问题,但有一个我不确定如何解决。

错误代码为C2668,其描述为:

"fpclassify': ambiguous call to overloaded function

项目是“运行 Simulation”,文件是第 415 行 corecrt_math.h

老实说,我不确定我提供的任何信息是否有任何用处,我也不确定提供什么信息。如果你能问我一些问题,我会尽力回答,也许会更好?

我附上了我的 Visual Studio 19:

的截图

(点击图片放大)

可重现的例子(demo

#include <cmath>

int main() {
    std::isnan(1);
}

预期结果:编译。

您可能以某种方式输入 std::fpclassify 一个整数。 Visual Studio 的 <cmath> 函数的整数重载存在问题,它会像您的情况一样表现出来,而不是根据以下内容将整数转换为 double

c.math.syn#2.2:

[…] if any argument of arithmetic type corresponding to a double parameter has type double or an integer type, then all arguments of arithmetic type corresponding to double parameters are effectively cast to double.

我写了一个 error report for std::signbit 但它对我测试过的所有 <cmath> 函数都是一样的,std::fpclassify 就是其中之一 - 它被许多其他 cmath 函数。

corecrt_math.h 中的第 415 行在内部调用 fpclassifyisnan 函数中。

解决问题的步骤:

  • 构建项目时,您会在 错误列表 框中获得错误列表。查找显示 see reference to function template instantiation 'bool isnan<int>(_Ty) noexcept' being compiled 或类似内容的行。 <int> 部分可以是任何整数类型。
  • 双击该行,IDE 应将光标置于对 isnan 的调用上,该调用使用整数进行。
  • isnan(integer) 调用替换为 isnan(static_cast<double>(integer)).
  • 对导致问题的任何其他 cmath 函数重复这些步骤。

注意:对整数使用 isnan 是没有意义的。 isnan(integer) 将始终 return false 因此打开优化的编译器应将整个调用替换为false