web-dev-qa-db-ja.com

「sqrt」は「std」のメンバーではありません

私はプログラムをLinuxでコンパイルします-次の行があります:

std::sqrt((double)num);

Windowsでは問題ありませんが、Linuxでは「sqrt」が「std」のメンバーではないので、math.hにインクルードします

それの何が問題なのですか?

17
Yakov

ディレクティブを#include <cmath>に変更します。 <cxxxxxxx>の形式のC++ヘッダーは、std名前空間に標準名が付いていることが保証されています(オプションで、グローバル名前空間にそれらを提供できます)。 <xxxxxx.h>はそうではありません。

25
jrok

これは、<math.h>namespace stdで関数を宣言していないためです。互換性の理由でのみC++標準に含まれています。正しいC++インクルードは<cmath>です。

§D.5,2

name.hという形式の名前を持つCヘッダーはすべて、対応するcnameヘッダーによって標準ライブラリの名前空間に配置された各名前がグローバル名前空間スコープ内に配置されているかのように動作します。これらの名前が最初に名前空間stdの名前空間スコープ内で宣言または定義され、次に明示的using-declarations

あなたのコードがウィンドウズの下で動くことは純粋に幸運でした-あなたがそれをそうしたいなら。最後の文は、LinuxではなくWindowsで発生する可能性のあるヒントを示しています。Windowsでは、名前はグローバル名前空間と名前空間stdの両方で有効です。

5
Arne Mertz