この記事では、STD C++ ライブラリから関数を参照するときに発生する C2653 または C2039 エラーの解決に関する情報を提供します。
元の製品バージョン: Visual C++
元の KB 番号: 243444
現象
名前空間std
(std::exit(0)
など) を使用して std C++ ライブラリ ヘッダー<cstdlib>
から関数を参照しようとすると、コンパイラは (エラーが生成された時点で名前空間std
が定義されているかどうかに応じて) C2653 または C2039 を出力します。
原因
<cstdlib>
では、名前空間 std
は定義されません。 これは、次の Visual C++ ドキュメントに反しています。
std
名前空間内に標準ヘッダー <stdlib.h>
を効果的に含めるには、標準ヘッダー <cstdlib>
を含めます。
解決方法
この問題を回避するには、名前空間std
に#include <cstdlib>
を配置します。
詳細
次のコードをコンパイルしようとすると、コンパイラに次のエラーが表示されます。
エラー C2653: 'std' : クラスまたは名前空間名ではありません
// Compile Options: /GX
#include <cstdlib>
void main()
{
std::exit(0);
}
ただし、次のコードをコンパイルしようとすると、コンパイラに次のエラーが表示されます。
エラー C2039: 'exit' : 'std' のメンバーではありません
// Compile Options: /GX
#include <vector>
#include <cstdlib>
void main()
{
std::exit(0);
}
最初のケースでは、名前空間 std
が定義されていないため、C2653 が表示されます。 2 番目のケースでは、名前空間 std
が (ヘッダー <vector>
で) 定義されているため、C2039 が表示されますが、関数 exit
はその名前空間の一部ではありません。 どちらの場合も問題を回避するには、次のように名前空間std
に#include <cstdlib>
を囲むだけです。
// Compile Options: /GX
namespace std
{
#include <cstdlib>
};
void main()
{
std::exit(0);
}