关于C ++:’round’不是’std’的成员

'round' is not a member of 'std'

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

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

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

1
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或更高版本的标准进行编译。


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

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

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

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

但是g++(不正确地)包括C99标头,即使使用-std=c++98 -pedantic进行编译时也应禁用所有非标准的东西:

GNU_SOURCE is defined by G++ and ... it implies _USE_ISOC99

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

这就是::round起作用的原因。

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

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


怎么样

1
2
3
4
float myRoundFunc(float toRound)
{
  return std::ceil(toRound - 0.5);
}

这样就没有比较,它将正确地四舍五入。


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

1
2
3
4
//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 ++标准中的内容与相应标准C库中的math.h相同,除了一些更改(C ++ 11中的第26.8 / 4节):

The contents of these headers [ and ] are the same as the Standard C library headers and respectively [...]

但是,它们在std的命名空间范围内(在C ++ 11中为§17.6.1.2/ 4):

In the C++ standard library, however, the declarations (except for names which are defined as macros in C) are within namespace scope (3.3.6) of the namespace std.

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