C++,在使用const_iterator使运算符=时出现问题

C++, having issues using const_iterator to make operator=

本文关键字:运算符 问题 const C++ iterator      更新时间:2023-10-16

在编写以下内容时发生编译错误:

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 */                             
};   

如果有人能帮助我,我将不胜感激。

您最直接的问题是因为您没有const版本的begin:

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

但是const_iterator类也使用了map的迭代器,这将导致另一个问题。

如果您正在编写一个看起来像容器的类,那么除了编写constcorrect迭代器和const_iterator类并提供constcorrect成员之外,别无选择。

然而,如果你不是在写一个容器,你可能不想这样做。最好的情况是为类提供一个容器不可知的接口,例如,您可以在其中提供有意义的名称,而不是直接访问容器。或者,通过映射const_iterator提供仅const访问(不要编写自己的迭代器类)。

如果您想在类中完全封装std容器(艰巨且通常不必要的任务),则需要确保还定义了所有转换。特别是,标准容器迭代器有一个构造函数,它从迭代器中创建const_iterator(但不是相反!)。你也必须自己创造它。

然而,更好的设计选择是简单地公开成员map变量。