'round'不是'std'的成员

时间:2012-10-02 19:16:19

标签: c++ g++

我正在尝试编译此代码:

#include <cmath>
double gravity (double level) {
    return 0.02 * std::round(level);
}

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

error: 'round' is not a member of 'std'

我知道我之前在 ISO C ++ 98 中多次使用过round函数。不同寻常的是,round::round都有效。

是什么给出了?

更新:我正在使用g++ -std=c++98 -Wall -pedantic进行编译。 切换到std=c++0x有效。

但是,如果round没有,那么为什么不合格/匿名的::roundstd::round都有效?

5 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:12)

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

round ISO 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有效的原因。

这显然是海湾合作委员会的一个错误:Why does GCC allow use of round() in C++ even with the ansi and pedantic flags?

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

答案 2 :(得分:5)

怎么样

float myRoundFunc(float toRound)
{
  return std::ceil(toRound - 0.5);
}

这种方式没有比较,它会正确地圆整。

答案 3 :(得分:4)

旧主题,但对于在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);

答案 4 :(得分:3)

在C ++ 03标准中,标准C库的规范性引用是ISO / IEC 9899:1990(C90),其中包含{ {1}}功能。在C ++ 11中,它是ISO / IEC 9899:1999(C99), 包含round函数。

每个C ++标准中round的内容与相应标准C库中的<cmath>相同,除了一些更改(C ++ 11中的第26.8 / 4节):

  

这些标题[math.h<cmath>]的内容分别与标准C库标题<cstdlib><math.h>相同[...]

然而,它们在<stdlib.h>的命名空间范围内(C ++ 11中的第17.6.1.2 / 4节):

  

但是,在C ++标准库中,声明(在C中定义为宏的名称除外)在命名空间std的命名空间范围(3.3.6)内。

因此,为了将其包装起来,std函数在C ++ 03中不可用,因此使用round选项进行编译并将其称为-std=c++0x