- ベストアンサー
map(STL)でinsertを行いたいですが、成功できないでいます。
皆さん、こんにちは。 このほど、STLのMAPを勉強しだしたものですが、 もっと基本的な、 C++の事でつまずいてしまいました。 keyとvalueのセットを 登録したり、 取得したりするソースを書いています。 下記ソースにありますとおり、 getの指示を出した際は、 通常、find(key)を行い、 valueを得るのですが、 仮にfindにて意図するvalueが見つからなかった場合には、 MySQLから意図するkeyに対応するvalueを 取ってこようと思っています。 そして、MySQLからvalueを取得した後は、 「m1.insert」にて 取得したその「value」と「key」のセットを insertを行う事で、 コンテナに登録作業をしたいつもりなのです。 どんな1行を足せばいいでしょうか? ずばりの答えでなく、 ユルメな方針のアドバイスでも いただけるとありがたいです。 ================================================================= virtual void put(key_type key, value_type val) { m1.insert(std::make_pair(key, val)); } virtual void get(key_type key) { typename container_type::iterator iterator = m1.find(key); if (iterator != m1.end()) { CTL_INFO("", "[info] Got the value ."); } else { /* ここでMySQLへ接続を行う*/ char query[256]; std::stringstream keystream ; keystream << key; std::string key1 = keystream.str().c_str(); if(sprintf(query, "select value_dht from table_name where key = ('%s')",keystream.str().c_str())); mysql_query(conn, query); res = mysql_use_result(conn); //get the results while ((row = mysql_fetch_row(res)) != NULL){ std::stringstream keydb2stream ; key2stream << row[0] ; std::string val1 = key2stream.str().c_str(); } /* ここで、MySQLから得たvalについて、 上記「virtual void put」のように「m1.insert」を行いたい。 それにより、returnで再度virtual void getへ移動した際には、 「m1.find(key)」を成功させたいです。*/ } return 0; }; ================================================================= また、間違っているかもしれませんが、 試しに、 「return 0」の2行上で、 次の1行を入れてみたのですが、 コンパイル時にエラーが出て怒られて失敗をしてしまいました。 「virtual void put」の部分で行っているinsertと、 同じ内容の文字列を同じようにinsertしているのに、 今回は怒られてしまうのかも、 よく分かりませんでした。 的外れな対応でしたらすいません。 ======================================================== m1.insert(std::make_pair(keystream.str().c_str(), key2stream.str().c_str())) ======================================================== error: cannot convert ‘const char*’ to ‘sc::basic_message_cons<sc::basic_message<void, char> >*’ in initialization
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 要は std::pair(key_type, value_type) に渡して出来上がったペアの型と、std::map<key_type, value_type, compare, allocator>::insert() が求めるペアの型が合わないのではないでしょうか。 virtual void put(key_type key, value_type val) の場合に大丈夫な理由は恐らく、key_type と value_type に暗黙変換され、内部では std::make_pair(key_type, value_type) が形成されて、std::map<key_type, value_type, compare, allocator>::insert() が求めるペアの型と一致しているからだと思います。 兎に角、型を合わせないといけません。 後、 std::string val1 = key2stream.str().c_str(); ですが、 std::string val1 = key2stream.str(); で出来る筈です。
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
m1 の型が分かりませんが, エラーメッセージがすべてだと思います. sc::basic_message_cons<sc::basic_message<void, char> > が何かは知りませんが, なんとかしてそれへのポインタに変換しないとダメ. それ以前に「そこで自力で insert する」意味が分からん. put を呼び出せばいいだけじゃないの?
お礼
putに飛ばしたら、 やはり、型の事でコンパイル時に怒られ、 やはり、 型の問題である事を認識できました。 ということで、 後に解決できました。 ありがとうございました。
お礼
分かりました! 色々と参考になりました! ありがとうございました!
補足
machongolaさん アドバイスいただきありがとうございます! 色々と考える中、 確かに型の問題であることを、 自分でも実感が持ててきました! 書き漏れていたのですが、 前回までで記述済みの、 「virtual void put(key_type key, value_type val) 」の上の行に、 以下の内容があり、 テンプレートが適用されているのですが、 この場合、私が挿入した m1.insert(std::make_pair(keystream.str(), key2stream.str()))において、 どんな型に合わせるのが 適切なのでしょうか? それとも、記述の仕方が悪いのですかね? stringstreamのデータを char型にしたいと思って、 「str().c_str()」をつけたりしていました。 これで、エラーがでているということは char型に合わせようとしたのが間違いなのですかね? ================================================================= template<typename KEY, typename VALUE> class fruit : public s_t<fruit<KEY, VALUE>> { public: typedef KEY key_type; typedef VALUE value_type; typedef typename std::map<key_type, value_type> m1_type; } =================================================================