'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都能起作用?
-
不,不是:cplusplus.com/reference/clibrary/cmath
-
stackoverflow.com/questions/485525/round-for-float-in-c
-
@HugoCorr是的,但仅在C ++ 11中:en.cppreference.com/w/cpp/numeric/math/round
-
@ juanchopanza iteresting,我不知道。 谢谢!
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函数(因为标准不需要),因此我应该定义自己的函数。
-
您不应该尝试定义自己的回合,在这里看到我的答案实际上比看起来要难得多。可悲的是,对类似线程的大量回答确实做到了这一点,而它们大多是错误的,是微妙的方式。有些人被否决,但许多人甚至被接受。
-
这好笑。对于C ++ 03中缺少std::round的我,解决方法是改用中的round,并依赖意外提供功能的GCC错误。该错误甚至不被继承。干得好,C ++!
-
自从@PreferenceBean Ive迁移到C ++ 11:gcc -std=c++11。除其他外,它具有std::round函数。
-
@QuasarDonkey:很好。我在C ++ 03上。
怎么样
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。
-
谢谢,但是如果cmath和math.h相同,则它不能解释:: round为什么起作用,而std :: round无法起作用。我使用g ++ -std = c ++ 98 -Wall -Wextra -pedantic进行编译。
-
我给它做了一个测试,您呢。我只能想象会执行#include ,并且仅将函数的C90版本拉入std,而其他所有内容仍保留在全局命名空间中。 std中应该可用的功能(例如sin)的确确实像std::sin(90.0)那样工作。