2014-01-09 11 views
5

私はHW割り当ての一部としてマップを実装しています。マップは2種類のイテレーターをサポートする必要があります。イテレータのタイプが正しくありません

  • イテレーター - マップを変更できます。
  • constant_iterator - マップの変更を許可しません。

    map_test.cpp:49:43: error: no viable conversion from 'Map<basic_string<char>, int>::iterator' to 'Map<std::string, int>::const_iterator' 
         for(Map<std::string,int>::const_iterator it = msi.begin(); it != msi.end(); ++it) { 
                   ^ ~~~~~~~~~~~ 
    ./map_new.h:57:3: note: candidate constructor not viable: no known conversion from 'Map<basic_string<char>, int>::iterator' to 'const 
         Map<basic_string<char>, int>::const_iterator &' for 1st argument 
           const_iterator(const Map<KeyType, DataType>::const_iterator& sIterator): 
           ^
    

    :私は次のような問題を取得し

    for(Map<std::string,int>::const_iterator it = msi.begin(); it != msi.end(); ++it) { 
        std::cout << *it << std::endl; 
    } 
    

    :私は次のコードで私の実装をテストしかし

    Map::const_iterator begin() const; 
    Map::const_iterator end() const; 
    Map::iterator begin(); 
    Map::iterator end(); 
    

私は以下のメソッドを持っていますこれは、コンパイラが間違ったbegin/end mを選択したことを意味します。エトド

どうすればこの問題を解決できますか?

答えて

11

iteratorからconst_iteratorへの暗黙的な変換を指定することによって、これにはconst_iteratoriteratorのコンストラクタを指定するか、iteratorconst_iterator変換演算子を指定します。 C++ 11では

std::vector<int> v; 
std::vector<int>::const_iterator it = v.begin(); 

、あなたも非constインスタンスに対して、直接const_iteratorsを返すメソッドを持っている:

このアプローチは、あなたがこの種のものを行う際に、標準ライブラリで使用されています。あなたはまた、constのイテレータを返しますcbegin()cend()メンバ関数を作成することが

std::vector<int> v; 
std::vector<int>::const_iterator it = v.cbegin(); 
+0

しかし、これは問題を回避するだけでしょうか? –

+0

@Doppelgangerいいえ、問題を解決するはずです。これは、標準のライブラリコンテナで行われます。 – juanchopanza

+0

本当に、問題を解決してくれてありがとう。 [より洗練されたソリューションが存在すると確信していました] –

2

:あなたは戻り値の型でオーバーロードできませんので、しかし、これらは、別の名前を必要とします。

+0

cbegin/cendがC++ 11標準で追加されたことを追加するのを忘れてしまい、初期のコンパイラでは動作しません。 –

+0

TSは自分自身のMapクラスを実装しているので、好きな名前を選ぶことができます – nikitoz

+2

@Sergeyこれらの関数はカスタムクラスで定義されるため問題ありません – vershov

2

この問題を回避するには、いくつかの方法があります。

  1. ループ
  2. は次のようにオブジェクトの定義「について」の代わりにconst_iteratorのの使用イテレータ:

    const Map<string, int> msi; 
    
  3. を地図にマップ:: const_iteratorのを変換するために、あなたのイテレータクラスで演算子を定義します::イテレータ

関連する問題