質問
このコードをコンパイルしようとしています:
#include <cmath>
double gravity (double level) {
return 0.02 * std::round(level);
}
しかし、GCC は私にこう言っています。
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 では、ansi フラグや衒学的なフラグを使用した場合でも、C++ でのround() の使用が許可されるのはなぜですか?
他の C++ コンパイラは、 round
関数 (標準では必須ではないため) なので、独自の関数を定義する必要があります。
どうですか
float myRoundFunc(float toRound)
{
return std::ceil(toRound - 0.5);
}
そうすれば比較はなくなり、適切に丸められます。
古いトピックですが、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);
C++03 標準では、 標準Cライブラリ ISO/IEC 9899:1990 (C90) です。 ではない を含める round
関数。C++11 では、ISO/IEC 9899:1999 (C99) です。 する を含める round
関数。
の内容 <cmath>
各 C++ 標準では次と同じです math.h
いくつかの変更 (C++11 の §26.8/4) を除き、対応する標準 C ライブラリからのものです。
これらのヘッダーの内容 [
<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
.