“fpclassify”:对重载函数的模糊调用
"fpclassify': ambiguous call to overloaded function
我有一个与这个非常相似的问题:
我有一个大型项目,其中包含大约 100 个 cpp 文件和 100 个头文件,它们在使用 GNU GCC 编译器的 Codeblocks 中运行良好,但我想将该项目迁移到 VS19。除了一个错误外,它似乎工作正常:"fpclassify': ambiguous call to overloaded function
VS19 中的错误列表告诉我它位于 corecrt_math.h
中第 415 行的 return 值:
template <class _Ty>
_Check_return_ inline bool isnan(_In_ _Ty _X) throw()
{
return fpclassify(_X) == FP_NAN;
}
查看我的代码时,我发现我在 13 个文件的 24 个位置中使用了 std::isna
(错误列表根本不涉及这些位置)。但是,与我上面链接的问题不同,我没有看到我在任何地方检查 int
是否为 na
。相反,我有这样的情况:
if (std::isnan(static_cast<double> (min)) && std::isnan(static_cast<double> (max)))
simulation_error("Error: No limits");
其中min
和max
定义为const double & min = NAN
和const double & max = NAN
(min
和max
在构造函数中设置)。
您知道如何找到错误并解决它吗?我昨天试了好几个小时 - 没有成功。
编辑:
下面是完整的错误信息:
1>C:\Program Files (x86)\Windows Kits\Include.0.18362.0\ucrt\corecrt_math.h(415,1): error C2668: 'fpclassify': ambiguous call to overloaded function
1>C:\Program Files (x86)\Windows Kits\Include.0.18362.0\ucrt\corecrt_math.h(300,31): message : could be 'int fpclassify(long double) noexcept'
1>C:\Program Files (x86)\Windows Kits\Include.0.18362.0\ucrt\corecrt_math.h(295,31): message : or 'int fpclassify(double) noexcept'
1>C:\Program Files (x86)\Windows Kits\Include.0.18362.0\ucrt\corecrt_math.h(290,31): message : or 'int fpclassify(float) noexcept'
1>C:\Program Files (x86)\Windows Kits\Include.0.18362.0\ucrt\corecrt_math.h(415,1): message : while trying to match the argument list '(_Ty)'
1> with
1> [
1> _Ty=bool
1> ]
1>C:\Users\Name\Documents\C++\Project name\Project name\src\module.cpp(668): message : see reference to function template instantiation 'bool isnan<bool>(_Ty) noexcept' being compiled
1> with
1> [
1> _Ty=bool
1> ]
其中指的是:
std::vector<double> stoprule_rel;,
if (!(std::isnan(static_cast<double> (stoprule_rel[i])
像fpclassify': ambiguous call to overloaded function
这样的错误信息总是伴随着注释。例如,对于一个简单的程序
#include <cmath>
int main() {
std::isnan(5);
}
VS complains:
corecrt_math.h(415): error C2668: 'fpclassify': ambiguous call to overloaded function
corecrt_math.h(300): note: could be 'int fpclassify(long double) throw()'
corecrt_math.h(295): note: or 'int fpclassify(double) throw()'
corecrt_math.h(290): note: or 'int fpclassify(float) throw()'
corecrt_math.h(415): note: while trying to match the argument list '(_Ty)'
with [ _Ty=int ]
<source>(3): note: see reference to function template instantiation 'bool isnan<int>(_Ty) throw()' being compiled
with [ _Ty=int ]
从这些注释中我们可以推断出 _Ty
是 int
并且 std::nan
在我们源代码的第 3 行被调用。查看编译的完整编译器输出,它会告诉您代码中触发错误的确切位置。
我有一个与这个非常相似的问题:
我有一个大型项目,其中包含大约 100 个 cpp 文件和 100 个头文件,它们在使用 GNU GCC 编译器的 Codeblocks 中运行良好,但我想将该项目迁移到 VS19。除了一个错误外,它似乎工作正常:"fpclassify': ambiguous call to overloaded function
VS19 中的错误列表告诉我它位于 corecrt_math.h
中第 415 行的 return 值:
template <class _Ty>
_Check_return_ inline bool isnan(_In_ _Ty _X) throw()
{
return fpclassify(_X) == FP_NAN;
}
查看我的代码时,我发现我在 13 个文件的 24 个位置中使用了 std::isna
(错误列表根本不涉及这些位置)。但是,与我上面链接的问题不同,我没有看到我在任何地方检查 int
是否为 na
。相反,我有这样的情况:
if (std::isnan(static_cast<double> (min)) && std::isnan(static_cast<double> (max)))
simulation_error("Error: No limits");
其中min
和max
定义为const double & min = NAN
和const double & max = NAN
(min
和max
在构造函数中设置)。
您知道如何找到错误并解决它吗?我昨天试了好几个小时 - 没有成功。
编辑:
下面是完整的错误信息:
1>C:\Program Files (x86)\Windows Kits\Include.0.18362.0\ucrt\corecrt_math.h(415,1): error C2668: 'fpclassify': ambiguous call to overloaded function
1>C:\Program Files (x86)\Windows Kits\Include.0.18362.0\ucrt\corecrt_math.h(300,31): message : could be 'int fpclassify(long double) noexcept'
1>C:\Program Files (x86)\Windows Kits\Include.0.18362.0\ucrt\corecrt_math.h(295,31): message : or 'int fpclassify(double) noexcept'
1>C:\Program Files (x86)\Windows Kits\Include.0.18362.0\ucrt\corecrt_math.h(290,31): message : or 'int fpclassify(float) noexcept'
1>C:\Program Files (x86)\Windows Kits\Include.0.18362.0\ucrt\corecrt_math.h(415,1): message : while trying to match the argument list '(_Ty)'
1> with
1> [
1> _Ty=bool
1> ]
1>C:\Users\Name\Documents\C++\Project name\Project name\src\module.cpp(668): message : see reference to function template instantiation 'bool isnan<bool>(_Ty) noexcept' being compiled
1> with
1> [
1> _Ty=bool
1> ]
其中指的是:
std::vector<double> stoprule_rel;,
if (!(std::isnan(static_cast<double> (stoprule_rel[i])
像fpclassify': ambiguous call to overloaded function
这样的错误信息总是伴随着注释。例如,对于一个简单的程序
#include <cmath>
int main() {
std::isnan(5);
}
VS complains:
corecrt_math.h(415): error C2668: 'fpclassify': ambiguous call to overloaded function
corecrt_math.h(300): note: could be 'int fpclassify(long double) throw()'
corecrt_math.h(295): note: or 'int fpclassify(double) throw()'
corecrt_math.h(290): note: or 'int fpclassify(float) throw()'
corecrt_math.h(415): note: while trying to match the argument list '(_Ty)'
with [ _Ty=int ]
<source>(3): note: see reference to function template instantiation 'bool isnan<int>(_Ty) throw()' being compiled
with [ _Ty=int ]
从这些注释中我们可以推断出 _Ty
是 int
并且 std::nan
在我们源代码的第 3 行被调用。查看编译的完整编译器输出,它会告诉您代码中触发错误的确切位置。