3

私はこれをやろうとしています:

typedef std::map<std::string, time_t> my_map;
const mymap& some_function();

class bla
{
private:
  my_map::iterator current
  bla(const mymap& m) : current(m.begin())
  {   }
}

そして、それは機能していません。やや複雑な実際のエラー メッセージは次のとおりです。

エラー: 'std::_Rb_tree_iterator, long int> >::_Rb_tree_iterator(std::map, long int>::const_iterator)' の呼び出しに一致する関数がありません

初期化/代入をコンストラクタ本体に移動してみました:

{ current = m.begin(); }

どちらもうまくいきませんでした。の型が間違っていると思っcurrentたので、コンパイラに次のように推測させました。

...
   decltype(my_map::begin()) current;
...

どちらも機能しません。

必要なのは、構築時に設定される反復子メンバーだけblaなので、愚かな追加関数で明示的に設定する必要はなく、外部からマップを反復処理できます。

bool bla::do_stuff(...output...)
{ 
    if(current = m.end())
        return false;
    balblabla(current);
    ++current;
    return true;
}
4

2 に答える 2

6

に割り当てようとしていconst_iteratorますiterator。次の 2 つの解決策があります。

  1. 非 const 参照 ( bla(my_map& m) : current(m.begin()) {}) でマップを取得します。
  2. メンバー タイプを に変更しconst_iteratorます。
于 2012-07-12T19:17:08.030 に答える
4

const_iteratorconstコンテキストでは、 :のみを取得できます。

my_map::const_iterator current;
bla(const my_map & m) : current(m.begin()) { }

非定数イテレータが必要な場合はbla、非定数参照からオブジェクトを作成する必要があります。

于 2012-07-12T19:15:51.593 に答える