C++,在使用const_iterator使运算符=时出现问题
C++, having issues using const_iterator to make operator=
在编写以下内容时发生编译错误:
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
变量。
相关文章:
- 一个关于在C++中重载布尔运算符的问题
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- 运算符继承和 cpp 核心准则 c.128 的问题
- 在C++中使用重载提取运算符时出现问题
- 移动赋值运算符;尝试引用已删除的函数.我该如何解决这个问题?
- 关于条件块的问题与&&运算符有关
- 重载运算符与添加问题
- 加、乘、除、减复数的问题 C++ - 运算符重载
- C++中的三元条件运算符问题
- 重载+运算符问题与其他类中的友元函数混合
- C++中带有 cout 运算符问题的向量
- C++运算符=问题
- 模板类型的重载解析和运算符<<问题 - 第 2 部分
- 两相查找运算符<<问题?
- C++ 运算符问题 ()
- C++:如何将普通话(字符串)分配给用户使用数组输入的数字 &运算符问题
- 布尔运算符问题
- 相等运算符问题 (C++)
- 简单的运算符+问题躲避了我
- 重载运算符 I/O 问题