C++gcc"floorf"不是"std"的成员

C++ gcc `floorf` not a member of `std`?

本文关键字:quot 成员 std floorf C++gcc 不是      更新时间:2023-10-16

我有以下代码:

#include <cmath>
float foo(float x, unsigned int m, float q = 0.0f)
{
return std::floorf(x * float(m) + q);
}

现在,当我尝试用g++5.4.0和选项-std=c++11编译它时,我得到一个错误,说‘floorf’ is not a member of ‘std’

现在我的理解是,C++11标准的第26.8条规定标准C++库头<cmath>声明与标准C库头<math.h>相同的函数集,尽管在名称空间std中;第1.2条规定"C"应解释为C99;并且C99标准的条款7.12.9.2规定标准C库头CCD_ 6声明函数CCD_。

因此,根据这个推理,<cmath>应该声明一个函数float std::floorf(float),据我所知,它应该与我的代码相匹配。

什么东西?我是不是遗漏了什么?

(我知道C++11也定义了float std::floor(float);然而,我最近发现,浮点函数的f后缀变体通常稍快,所以我更喜欢专门调用floorf()。)

我相信您确实在标头中发现了一个错误。在我的GCC上,使用GNU C库(glibc),我可以通过将std::退出到全局名称空间,更改来解决问题

return std::floorf(x * float(m) + q);

return ::floorf(x * float(m) + q);

解决方法之所以有效,是因为floorf()属于C标准库,所以它在glibc中有一个全局符号。由于该解决方法使用全局符号,C++11允许但不要求全局符号存在,因此该解决方法是不可移植的。然而,对于glibc来说,这似乎奏效了。

如果您愿意,可以将#include <cmath>更改为#include <math.h>,并(据我所知)将所有C-math-library调用都放入全局命名空间,从而使解决方法变得可移植。不过,这仍然只是一个变通办法。

您可以继续在以下位置将其报告为错误:https://gcc.gnu.org/bugzilla/.此外,为了让GCC团队更认真地对待,您可以将错误报告链接回这里,以表明几个称职的人已经看到了这个问题。与此同时,干得不错。