つまらない事でつまづいたので覚え書き.
c++でstringをキーとしたmapを使用したのですが,mapの要素にアクセスしようとするとコンパイルエラーが発生.
#include <map> using namespace std; ... map< string, int > m; m["piyo"] = 1; // エラー,コメントアウトするとコンパイルは通る
「二項演算子'<‘:const std::stringは,…(略)…定義を行いません.」とのこと.
stringの定義がうまくいってないのかな,と思ったのですがmの定義時にstringを使用しているからstringは定義できているはず.しかも,違うソースファイルに同じ処理を書くと正しくコンパイルされる…
と,かなり悩んだ結果<string>のincludeを行っていないことが原因と判明.
VCではstring,basic_string自体は<xstring>に書かれており,<iostream>や<map>などをincludeするだけで使用可能になります.しかし,stringの<<演算子の定義などは<string>に書かれているようで,演算子を使用しようとすると演算子が定義されていないとのエラーがでるということみたいです.
なので,下のようなソースはコンパイルに通りますが,コメントを外すとコンパイルエラーになります.
#include <iostream> int main(){ std::string str = "piyo"; // std::cout << str << std::endl; // コメントを外すとエラー }
gccはさらにゆるくて,上のソースのコメントを外してもコンパイルが通ります.(cygwinのgcc 4.5.3)
templateのエラーのわかりづらさとあいまって,つまらない事で(つまらないことだからこそ?)かなりの時間を潰してしまいました.
もう,stringはincludeしてなければエラーが出るようにして欲しい.