我有以下代码:
#include <cmath>
float foo(float x, unsigned int m, float q = 0.0f)
{
return std::floorf(x * float(m) + q);
}
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试用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库头<math.h>声明一个函数float floorf(float).
因此,通过这种推理<cmath>应该声明一个函数float std::floorf(float),据我所知,该函数应该与我的代码匹配.
是什么赋予了?我在这里错过了什么吗?
(我知道C++ 11也定义了一个float std::floor(float);但是,我最近发现f浮点函数的-suffixed变体通常稍快一点,所以我更喜欢专门调用floorf().)
我相信你确实在标题中发现了一个错误.在我的GCC上,使用GNU C库(glibc),我可以通过退出std::全局命名空间来改变
return std::floorf(x * float(m) + q);
Run Code Online (Sandbox Code Playgroud)
至
return ::floorf(x * float(m) + q);
Run Code Online (Sandbox Code Playgroud)
解决方法有效,因为它floorf()属于C标准库,所以它在glibc中有一个全局符号.由于变通方法使用C++ 11允许但不需要存在的全局符号,因此变通方法是不可移植的.然而,对于glibc来说,它似乎有效.
如果您愿意,可以通过更改#include <cmath>为#include <math.h>和(据我所知)将所有C-math-library调用放入全局命名空间来使解决方法变得可移植.不过,这仍然只是一种解决方法.
您可以继续将此报告为错误:https://gcc.gnu.org/bugzilla/.此外,为了让GCC团队更加认真地对待,您可以将错误报告链接到此处,以显示几个有能力的眼睛已经看过这个问题.同时,干得好.