私はプログラムをLinuxでコンパイルします-次の行があります:
std::sqrt((double)num);
Windowsでは問題ありませんが、Linuxでは「sqrt」が「std」のメンバーではないので、math.hにインクルードします
それの何が問題なのですか?
ディレクティブを#include <cmath>
に変更します。 <cxxxxxxx>
の形式のC++ヘッダーは、std
名前空間に標準名が付いていることが保証されています(オプションで、グローバル名前空間にそれらを提供できます)。 <xxxxxx.h>
はそうではありません。
これは、<math.h>
がnamespace std
で関数を宣言していないためです。互換性の理由でのみC++標準に含まれています。正しいC++インクルードは<cmath>
です。
§D.5,2
name.h
という形式の名前を持つCヘッダーはすべて、対応するcname
ヘッダーによって標準ライブラリの名前空間に配置された各名前がグローバル名前空間スコープ内に配置されているかのように動作します。これらの名前が最初に名前空間std
の名前空間スコープ内で宣言または定義され、次に明示的using-declarations。
あなたのコードがウィンドウズの下で動くことは純粋に幸運でした-あなたがそれをそうしたいなら。最後の文は、LinuxではなくWindowsで発生する可能性のあるヒントを示しています。Windowsでは、名前はグローバル名前空間と名前空間std
の両方で有効です。