'round'不是'std'的成员

Qua*_*key 16 c++ g++

我试着编译这段代码:

#include <cmath>
double gravity (double level) {
    return 0.02 * std::round(level);
}
Run Code Online (Sandbox Code Playgroud)

但海湾合作委员会告诉我:

error: 'round' is not a member of 'std'
Run Code Online (Sandbox Code Playgroud)

我知道我以前roundISO C++ 98中多次使用过该功能.与众不同的是,round::round这两个工作.

是什么赋予了?

更新:我正在编译g++ -std=c++98 -Wall -pedantic.切换到std=c++0x工作.

但是为什么不合格/匿名round并且::round两者都有效std::round呢?

jua*_*nza 15

这些std::round函数是C++ 11,因此您需要使用C++ 11或更新的标准进行编译.


Qua*_*key 12

我做了一些研究,这是我发现的:

roundISO C++ 11中定义,因为它包含ISO C99标准库.

round不是ISO C++ 98的一部分,它使用ISO C90标准库.

这就是为什么它不在C++ 98的命名空间std中.

但是g++(错误地)包括C99标题,即使在编译时-std=c++98 -pedantic,也应禁用所有非标准内容:

GNU_SOURCE由G ++定义,它意味着_USE_ISOC99

(来自http://gcc.gnu.org/ml/gcc/2002-09/msg00580.html)

这就是为什么::round有效.

这显然是GCC中的一个错误:为什么GCC允许在C++中使用round(),即使使用ansi和pedantic标志?

其他C++编译器可能不提供round函数(因为它不是标准所要求的),所以我应该定义自己的函数.


小智 5

旧主题,但可能对在 google 中搜索的人有用:

//TODO: C++11 got round() function defined in math.h
float distance = sqrt((float)(plus_x * plus_x + plus_y * plus_y));
if (distance >= floor(distance)+0.5) distance = ceil(distance);
else distance = floor(distance);
Run Code Online (Sandbox Code Playgroud)


小智 5

怎么样

float myRoundFunc(float toRound)
{
  return std::ceil(toRound - 0.5);
}
Run Code Online (Sandbox Code Playgroud)

那样就没有比较了,它会圆滑.