
皆さん、こんにちは。
このほど、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
No.1ベストアンサー
- 回答日時:
こんばんは。
要は 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;
}
=================================================================
No.2
- 回答日時:
m1 の型が分かりませんが, エラーメッセージがすべてだと思います. sc::basic_message_cons<sc::basic_message<void, char> > が何かは知りませんが, なんとかしてそれへのポインタに変換しないとダメ.
それ以前に「そこで自力で insert する」意味が分からん. put を呼び出せばいいだけじゃないの?
putに飛ばしたら、
やはり、型の事でコンパイル時に怒られ、
やはり、
型の問題である事を認識できました。
ということで、
後に解決できました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JSONで文字列が長い時
-
メモリをアドレスを直接指定し...
-
Application.ScreenUpdating = ...
-
16進の10進変換について
-
formで特定のinputを送信しない...
-
文字の横にプルダウンを表示さ...
-
<SELECT>タグの折り返し
-
セレクトメニューで2つの項目...
-
シェルスクリプトで、空白(ス...
-
実行時エラー 3020の対策
-
VB6で、長い時間かかる処理...
-
C言語のflagの使い方が分かりま...
-
vbaでxmlからNodeListでデータ...
-
[python] 文字列を変数名として...
-
【至急!!!】python言語で本を見...
-
セレクトボックスの「選択して...
-
FindFirst を複数条件で検索
-
セレクトボックスから別窓にジ...
-
VBAでPDFのコピーとリネームを...
-
ACCESS テキストボックスを隙...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JSONで文字列が長い時
-
メモリをアドレスを直接指定し...
-
リロード後にプルダウンの選択...
-
フォームのINPUT NAM...
-
【C#】数値の範囲チェックについて
-
linq で 楽天ウェブサービスのX...
-
ラズパイで感圧センサーを動か...
-
map(STL)でinsertを行いたいで...
-
formのvalueについて
-
jcode.plの使い方
-
CGI(Perl)で、Net::FTPを使いたい
-
Perlでアルファベットを数...
-
tr///;はカンマを処理できない...
-
gpioを使ってSPIをシミュレーシ...
-
半角スペースが有効にならない。
-
連結リストについて
-
Application.ScreenUpdating = ...
-
formで特定のinputを送信しない...
-
実行時エラー 3020の対策
-
<SELECT>タグの折り返し
おすすめ情報