• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:map::find()の戻り値が変数に入ってくれません。)

map::find()の戻り値が変数に入ってくれません。

このQ&Aのポイント
  • map::find()の戻り値が変数に入ってくれません。
  • std::map<ユーザー型,ユーザー型>::iteratorを定義しないといけないのでしょうか?
  • どなたかお知恵をお貸しください。

質問者が選んだベストアンサー

  • ベストアンサー
  • Fooky
  • ベストアンサー率71% (59/82)
回答No.2

うちの環境(コンパイラ:gcc,OS:Linux)でStateAndReturn,NextStateAndFunc,my_less,_EventFuncMapを下記の通りに,Funcsを適当に定義してから問題の行を書いたんですが,コンパイラエラーは出ませんでした.やはりVCのmap::iteratorの実装方法に依存した問題のようで,私の方ではお手上げです. 多分,試されてると思いますが,代入方法などをいろいろ変えて回避するしかないように思います. 1.コピーコンストラクタ: ...>::const_iterator ite(EventFuncMap.find(...)); 2.反復子にコピーしない: return EventFuncMap.find(...)->second; 3.iteをconst_iteratorではなくiteratorにしてみる(エラーメッセージからはfindの出力はconst_iterator&ではなくiterator&になっているようなので) 他にも回避策はあるかもしれませんが,思いついたのはこれくらいです.

その他の回答 (1)

  • Fooky
  • ベストアンサー率71% (59/82)
回答No.1

どういうエラーになるんですか?ぱっと見たところ,反復子との型の不一致ということは無いんですか? map<StateAndReturn, NextStateAndFunc, my_less> EventFuncMap; なのに, map<StateAndReturn, NextStateAndFunc>::const_iterator ite; で ite = EventFuncMap.find(...); という風に受けているのが問題なのかなと. map<StateAndReturn, NextStateAndFunc, my_less>::const_iterator ite; で受けてもだめなんでしょうか.

noname#4877
質問者

お礼

こんにちは、boundaryです。 とりあえず解決しました。 とあるホームページのとある方より正しいコードを頂戴しました。 (その際、クロスポストのお叱りを受けました。失礼しました。) またまた最大投稿文字数の関係で全てを記述できないので、 要点にまとめて書きます。 struct StateAndReturn { int State; int Return; StateAndReturn(int s =0, int r =0) : State(s), Return(r) {} }; template<typename F> struct NextStateAndFunc { typedef int (F::*func_type)(); int NextState; func_type MemFuncPointer; NextStateAndFunc(int s =0, func_type f =0) : NextState(s), MemFuncPointer(f) {} }; とし、 typedef typename NextStateAndFunc<F>::func_type func_type; typedef std::map<StateAndReturn, NextStateAndFunc<F>, my_less> map_type; template<typename F> const NextStateAndFunc<F> CEventManager<F>::Answer(int StateNow, int ServerReturnCode) { typename map_type::const_iterator ite = EventFuncMap.find(StateAndReturn(StateNow,ServerReturnCode)); return ite->second; } との事です。 僕のとの違いを今考えているのですが正直言ってよくわかりません。(^◇^) 違いはメンバ関数スコープ内にローカルオブジェクトを作ってmap::find()のと メンバ関数の引数としての一時オブジェクトをmap::find()に渡してるだけだと 思うのですが、(-.-;)y-~~~ 何分初心者ですので(テンポラリなセリフ・・・)しばしゆっくり考えてみたいと思います。 ありがとうございました。q( ̄ω ̄)p

noname#4877
質問者

補足

こんにちは、Fookyさん。 お返事ありがとうございます。 >反復子との型の不一致ということは無いんですか? すみません。貼り付け間違いました。 map<StateAndReturn, NextStateAndFunc>::const_iterator ite; ← × map<StateAndReturn, NextStateAndFunc, my_less>::const_iterator ite; ← ○ my_lessは、 struct my_less : binary_function<_StateAndReturn, _StateAndReturn, bool>{ bool operator()(const _StateAndReturn& x, const _StateAndReturn& y){ return x.State < y.State; } }; としてます。  エラーの内容ですが、 error C2679: 二項演算子 '=' : 型 'class std::_Tree<struct _StateAndReturn,struct std::pair<struct _StateAndReturn const ,struct NextStateAndFunc>,struct std::map<struct _StateAndReturn,struct NextStateAndFunc,struct my_less,class std::allocator<struct NextStateAndFunc> >::_Kfn,struct my_less,class std::allocator<struct NextStateAndFunc> >::iterator' の右オペランドを扱う演算子は定義されていません。(または変換できません)(新しい動作; ヘルプを参照) となっています。

関連するQ&A