error C2871: 'std' : この名前を指定された名前空間は存在しません。

このエラーで検索しても期待した回答が得られず、ドッタンバッタン大騒ぎしている人向けにメモ書きを残しときます。ポンコツ記事なのでたぶん役に立ちません。

[環境]
VC++ (C++/CLI)
 
[エラーになったコード]
using namespace std;
std::string str;
 
[解決策]
#include <string>  ←追加 (※string.hではない)
using namespace std;
std::string str;

大半のかしこいフレンズから「は?」という声が聞こえて来そうだが、「よくわかんないけど動けばいいや!」というSE(サーバルエンジニア)は案外こういうのでハマる。(と思う)
持ち前のジャンプ力で、C言語からC++/CLIに3段くらい上ってしまった場合は特に危険。

これはコンパイラが「std」ではなく「std::string」の方を指してくくれば、サーバルエンジニアでも「たぶん#includeが無いんだね!」と推測できそうだが、さすがにそこまでナビゲートできないのが案内ロボットの限界である。

そもそもこういう勘違いが起こるのは、VC++でフォームアプリ等を作ると#includeを書かなくてもSystem名前空間が宣言できてしまうのが原因の1つだと思う。

using namespace System;  ←これは正常

System名前空間が宣言できるのだから、C++標準のstd名前空間は当然書けると思ってしまい・・・

using namespace std;   ←これはエラーになる

「あれ?Systemが書けるのにstdが書けないよ?・・・あ、そっかー!C++C++/CLIって全然違うみたいだし、C++/CLIにはstd名前空間が存在しないんだね!」
と、どんどん違う方向に突っ走ってしまいかねない。

そのようなサーバルエンジニアを、このポンコツ記事で1人でも救う事ができれば本望である。
のけものはいないのだから。

[解説]
 
#include <string.h>
→標準関数などが定義されている。
 
#include <string>
→「std名前空間」と「std名前空間内の関数」などが定義されている。
 
なお同じ名前空間は2回以上出現しても問題ない。
例えば次のコードを書くと、Japari名前空間内にidol関数とboss関数が作成される。
 
namespace Japari{
  char* idol(void){
    return "ペパプ";
  }
}
namespace Japari{
  char* boss(char* name){
    if(!strcmp(name, "カバン")) return "ヤア、カバン";
    else           return "検索中・・・";
  }
}