C++gcc"floorf"不是"std"的成员
C++ gcc `floorf` not a member of `std`?
我有以下代码:
#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团队更认真地对待,您可以将错误报告链接回这里,以表明几个称职的人已经看到了这个问题。与此同时,干得不错。
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 助记符和指向成员语法的指针
- 用于访问容器<T>数据成员的正确 API
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 嵌套在类中时无法设置成员数据
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 将函数类成员映射到类本身内部
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 将公共但非静态的成员函数与ALGLIB集成
- 多成员Constexpr结构初始化
- "非静态数据成员之前需要构造函数" - 我是否使用"boost::variant"