皆さん、こんにちは。
このほど、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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Visual Basic(VBA) シフト表のコマで「ブロック」されている前の時間の「出」を同一列の「休」と入れ替えたいがふぇきません。 2 2023/08/02 18:49
- JavaScript 電車の運賃を出すプログラムを作っています。 2 2022/06/22 09:36
- JavaScript Json のキーと値の出力の違いについて 2 2022/06/14 20:22
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- その他(プログラミング・Web制作) Pythonで会員サイトの自動ログイン ID Nameがない 1 2022/12/16 02:09
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- MySQL 何にかが違うから エラーなんでしょうね! 2 2022/09/18 05:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
メモリをアドレスを直接指定し...
-
JSONで文字列が長い時
-
半角スペースが有効にならない。
-
Perlでアルファベットを数...
-
【C#】数値の範囲チェックについて
-
linq で 楽天ウェブサービスのX...
-
formで特定のinputを送信しない...
-
Application.ScreenUpdating = ...
-
実行中の変数の中身をイミディ...
-
セレクトメニューで2つの項目...
-
日齢計算プログラム
-
switch文のエラーについて
-
実行時エラー 3020の対策
-
C言語のflagの使い方が分かりま...
-
vbaでxmlからNodeListでデータ...
-
2つのpythonがあって、一方で...
-
VBAでPDFのコピーとリネームを...
-
プルダウンメニューがプルアップに
-
Pythonでプログラミング プログ...
-
【メモリ不足で落ちる(python)】
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JSONで文字列が長い時
-
メモリをアドレスを直接指定し...
-
フォームで入力した値を表示し...
-
【C#】数値の範囲チェックについて
-
ラズパイで感圧センサーを動か...
-
linq で 楽天ウェブサービスのX...
-
Perlでアルファベットを数...
-
CGIでのページ指定~その(2)
-
途中まで出来ているのですが‥(D...
-
CGIやPHPで外部ファイルの内容...
-
CGIからメールに書き出しする際...
-
デコードできない時があります><
-
map(STL)でinsertを行いたいで...
-
フォームのINPUT NAM...
-
gpioを使ってSPIをシミュレーシ...
-
Application.ScreenUpdating = ...
-
どちのほうがすきですか?
-
formで特定のinputを送信しない...
-
文字の横にプルダウンを表示さ...
-
16進の10進変換について
おすすめ情報