20

私はこのコードをコンパイルしようとしています:

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

しかし、GCCは私に言っています:

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

以前にISO C++98roundで関数を何度も使用したことは知っています。異常に、そして両方が機能します。round::round

何を与える?

更新: でコンパイルしていましたg++ -std=c++98 -Wall -pedantic。動作に切り替えstd=c++0xます。

しかし、そうでない場合、なぜ非修飾/匿名round::round両方が機能するのstd::roundですか?

4

5 に答える 5

17

関数は C++11 であるため、std::roundC++11 またはそれ以降の標準を有効にしてコンパイルする必要があります。

于 2012-10-02T19:18:03.527 に答える
13

少し調べてみましたが、以下のことがわかりました。

roundISO C99標準ライブラリが含まれているため、ISO C++11で定義されています。

roundISO C90標準ライブラリを使用するISO C++98の一部ではありません。

その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 および pedantic フラグを使用しても C++ で round() を使用できるのはなぜですか?

他の C++ コンパイラではround関数が提供されていない可能性があるため (標準で必要とされていないため)、独自の関数を定義する必要があります。

于 2012-10-02T20:29:28.303 に答える
4

C ++ 03標準では、標準Cライブラリの標準参照はISO / IEC 9899:1990(C90)であり、これには関数は含まれていませんround。C ++ 11では、この機能を含むのISO / IEC 9899:1999(C99)roundです。

各C++標準の内容は、いくつかの変更(C ++11の§26.8/4)を除いて、対応する標準Cライブラリの内容<cmath>と同じです。math.h

これらのヘッダー[<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

于 2012-10-02T19:32:25.483 に答える