dポイントプレゼントキャンペーン実施中!

皆さん、こんにちは。
このほど、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

A 回答 (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();
 で出来る筈です。

この回答への補足

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;
}
=================================================================

補足日時:2009/05/08 18:15
    • good
    • 0
この回答へのお礼

分かりました!
色々と参考になりました!
ありがとうございました!

お礼日時:2009/05/08 18:38

m1 の型が分かりませんが, エラーメッセージがすべてだと思います. sc::basic_message_cons<sc::basic_message<void, char> > が何かは知りませんが, なんとかしてそれへのポインタに変換しないとダメ.


それ以前に「そこで自力で insert する」意味が分からん. put を呼び出せばいいだけじゃないの?
    • good
    • 0
この回答へのお礼

putに飛ばしたら、
やはり、型の事でコンパイル時に怒られ、
やはり、
型の問題である事を認識できました。

ということで、
後に解決できました。
ありがとうございました。

お礼日時:2009/05/08 18:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!