"round"不是"std"的成员

'round' is not a member of 'std'

本文关键字:成员 不是 round std      更新时间:2023-10-16

我正在尝试编译以下代码:

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

但GCC告诉我:

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

我知道我以前在ISO C++98中多次使用round函数。不同寻常的是,round::round都能工作。

什么东西?

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

但是,如果std::round不起作用,为什么不合格/匿名的round::round都起作用?

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

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

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

怎么样

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函数。

每个C++标准中<cmath>的内容与相应标准C库中的math.h相同,但有一些变化(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