我尝试编译这段代码:

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

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

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

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

是什么赋予了?

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

但为什么不合格/匿名的人 round::round 两者都有效,如果 std::round 不是吗?

有帮助吗?

解决方案

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

其他提示

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

round 定义于 ISO C++11, ,因为它包含 ISO C99 标准库。

round 不属于 ISO C++98, ,它使用 ISO C90 标准库。

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

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 函数(因为标准不要求它),所以我应该定义自己的。

怎么样

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

这样就没有比较,并且会正确舍入。

老话题,但可能对在谷歌搜索的人有用:

//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);

在 C++03 标准中,规范性参考 标准C库 是 ISO/IEC 9899:1990 (C90),其中 才不是 包括 round 功能。在 C++11 中,它是 ISO/IEC 9899:1999 (C99),它 包括 round 功能。

的内容 <cmath> 每个 C++ 标准中的内容都相同 math.h 来自相应的标准 C 库,除了一些更改(C++11 中的§26.8/4):

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

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

然而,在 C++ 标准库中,声明(除了在 C 中定义为宏的名称)位于命名空间 std 的命名空间范围 (3.3.6) 内。

所以,总结一下, round 函数在 C++03 中不可用,因此使用 -std=c++0x 选项并将其称为 std::round.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top