0

次のように書くとコンパイルエラーが発生します。

const_iterator it = cp.begin();

const_iteratorのための私自身のクラスですconst iterator
cpクラスのオブジェクトですConjuntoPreguntas(以下を参照)。
エラーは次のとおりです。

mainprueba.cpp:30:6: error: no match for ‘operator=’ (operand types are ‘ConjuntoPreguntas::const_iterator’ and ‘ConjuntoPreguntas::iterator’)
  cit = CP.begin();
      ^
mainprueba.cpp:30:6: note: candidate is:
In file included from mainprueba.cpp:2:0:
conjuntopreguntas.h:258:21: note: ConjuntoPreguntas::const_iterator& ConjuntoPreguntas::const_iterator::operator=(const ConjuntoPreguntas::const_iterator&)
     const_iterator& operator=(const const_iterator& cit){
                     ^
conjuntopreguntas.h:258:21: note:   no known conversion for argument 1 from ‘ConjuntoPreguntas::iterator’ to ‘const ConjuntoPreguntas::const_iterator&’

コード:

class ConjuntoPreguntas{
private:
    map<int,Pregunta> preguntas;

public:     
    class const_iterator;

    class iterator{
    private:
          map<int,Pregunta>::iterator it;

    public:
          iterator & operator++(){
           ++it;
          }

          iterator & operator--(){
           --it;
          }

          pair<const int,Pregunta> &operator *(){
           return *it;
          }

          bool operator ==(const iterator &i){
           return i.it==it;
          }   

          bool operator !=(const iterator &i){
           return i.it!=it;
          }

          friend class ConjuntoPreguntas;
          friend class const_iterator;
    };


    class const_iterator{
    private:
          map<int,Pregunta>::iterator it;
    public:
          const_iterator(){ 
          }

          const_iterator & operator++(){
           ++it;
          }

          const_iterator & operator--(){
           --it;
          }

          pair<const int,Pregunta> &operator *(){
           return *it;
          }

          bool operator ==(const const_iterator &i){
           return i.it==it;
          }   

          bool operator !=(const const_iterator &i){
           return i.it!=it;
          }

          const_iterator& operator=(const const_iterator& cit){
          }

          friend class ConjuntoPreguntas;

    };

    iterator begin(){
        iterator i;
        i.it=preguntas.begin();
        return i;
    }   

    iterator end(){
        iterator i;
        i.it=preguntas.end();
        return i;
    }
/* other code, irrelevant to the problem */                             
};   

誰かが私を助けることができれば、私はとても感謝しています.

4

2 に答える 2

1

constあなたの最も差し迫った問題は、あなたがのバージョンを持っていないためですbegin:

   const_iterator begin() const
   {
        const_iterator i;
        i.it = preguntas.begin();
        return i;
    }

しかし、あなたのconst_iteratorクラスもマップのイテレータを使用しているため、別の問題が発生します。

コンテナーのようなクラスを作成している場合は、const-correct iterator および const_iterator クラスを作成し、const-correct メンバーを提供する以外に何もありません。

ただし、コンテナを作成していない場合は、これを行いたくない場合があります。最良のケースは、コンテナーに依存しないインターフェイスをクラスに提供することです。たとえば、コンテナーに直接アクセスするのではなく、意味のある名前を提供します。または、マップを介して const のみのアクセスを提供しますconst_iterator(独自の反復子クラスを作成しないでください)。

于 2015-12-07T22:02:50.767 に答える