皆さん、こんにちは。
このほど、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でアルファベットを数...
-
フォームで入力した値を表示し...
-
Application.ScreenUpdating = ...
-
VBAでPDFのコピーとリネームを...
-
実行時エラー 3020の対策
-
formで特定のinputを送信しない...
-
<SELECT>タグの折り返し
-
構造体の各データの表示につい...
-
16進の10進変換について
-
日齢計算プログラム
-
[python] 文字列を変数名として...
-
「*:*」って何を意味するのでし...
-
selectタグ内の特定のoptionの...
-
複数列を持ったリストボックス...
-
テーブル内でドロップダウンメ...
-
my $html<<EOMの意味を教えてく...
-
UWSCのSELECT文の記述方法
-
Perlにおける<?phpinfo();?>の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JSONで文字列が長い時
-
メモリをアドレスを直接指定し...
-
【C#】数値の範囲チェックについて
-
Perlでアルファベットを数...
-
途中まで出来ているのですが‥(D...
-
フォームで入力した値を表示し...
-
linq で 楽天ウェブサービスのX...
-
リロード後にプルダウンの選択...
-
CGIからメールに書き出しする際...
-
map(STL)でinsertを行いたいで...
-
半角スペースが有効にならない。
-
CGI(Perl)で、Net::FTPを使いたい
-
iteratorの再利用について
-
Visual Basicで作成したプログ...
-
クリックしたら順番に並び替わ...
-
ラズパイで感圧センサーを動か...
-
デコードできない時があります><
-
パターンマッチで変数でマッチ...
-
gpioを使ってSPIをシミュレーシ...
-
Application.ScreenUpdating = ...
おすすめ情報