编写以下内容时会出现编译错误:
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 */
};
如果有人能帮助我,我将非常感激。
答案 0 :(得分:1)
您最直接的问题是因为您没有<%= link_to "Edit the Profile", edit_dashboard_path %>
版本的const
:
begin
但是你的 const_iterator begin() const
{
const_iterator i;
i.it = preguntas.begin();
return i;
}
类也使用了map迭代器,这将导致另一个问题。
如果你正在编写一个看起来像容器的类,除了编写const-correct iterator和const_iterator类并提供const-correct成员之外什么都没有。
如果你不是在写容器,你可能不想这样做。最好的情况是为类提供与容器无关的接口,例如,您提供有意义的名称而不是直接容器访问。或者通过地图const_iterator
提供const-only访问权限(不要编写自己的迭代器类)。
答案 1 :(得分:0)
如果要将std容器完全封装在类中(令人生畏且通常是不必要的任务),则需要确保定义所有转换。特别是,标准容器迭代器有一个构造函数,它从迭代器创建const_iterator(但不是相反的方式!)。你也必须自己创建它。
然而,更好的设计选择是简单地公开成员map
变量。