- 締切済み
C++のSTL mapを使用するとセグメンテーション違反となる
こんにちは。C++でSTLのmapの簡単な使用テストを以下のプログラムで行っており、動作確認ができました。 /* Assoc_array.c */ #define MAIN // (#include省略) using namespace std; namespace Usefuls { class Assoc_array_str { private: map<string, string> _h; public: void set(string key, string val); string get(string key); }; void Assoc_array_str::set(string key, string val){ _h.insert(pair<string, string>(key, val)); } string Assoc_array_str::get(string key){ map<string, string>::iterator p; p = _h.find(key); return p->second; } } #ifdef MAIN int main(){ Usefuls::Assoc_array_str assoc; assoc.set("Konnichiwa", "Hello"); cout << assoc.get("Konnichiwa") << endl; return 0; } #endif /* ここまで */ しかし、これを以下のように他のファイルから呼び出すと(先頭の#define MAINを#undef MAINに変えます)、「セグメンテーション違反です」というメッセージが出てしまいます。 /* Aa_test1.c */ #include <iostream> using namespace std; namespace Usefuls { class Assoc_array_str { public: void set(string, string); string get(string); }; } int main(){ Usefuls::Assoc_array_str assoc; assoc.set("Konnichiwa", "Hello"); cout << assoc.get("Konnichiwa") << endl; return 0; } /* ここまで */ コンパイル方法は以下の通りです。 g++ -c Assoc_array.c g++ Aa_test1.c Assoc_array.o また、使用プラットホームはLinuxのCentOS 4.3です。 原因が分かる方、ご回答をよろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- jacta
- ベストアンサー率26% (845/3158)
デバッガで追ったわけではありませんが... Assoc_array_strのクラス指定子が、翻訳単位間で矛盾しているようです。 単一定義規則違反ですので、未定義の動作になったのではないでしょうか。
お礼
早速のご回答をありがとうございました。 Assoc_array.cと統一する形でAa_test1.cのAssoc_array_strを以下のように書き変えたところうまく行きました。 namespace Usefuls { class Assoc_array_str { private: map<string, string> _h; public: void set(string, string); string get(string); }; } 利用する可能性のある変数や関数だけを宣言すればいいのかと思っていましたが、全部宣言しなければならないのですね。