class DList{
struct Node{
T data_;
Node* next_;
Node* prev_;
Node(const T& data=T{},Node* next=nullptr, Node* prev=nullptr){
data_=data;
next_=next;
prev_=prev;
}
};
Node* front_;
Node* back_;
public:
DList(){
front_=nullptr;
back_=nullptr;
}
void push_front(const T& data);
~DList();
class const_iterator{
friend class DList;
DList* myList_;
Node* curr_;
const_iterator(Node* curr, DList* theList){
curr_ = curr;
myList_ = theList;
}
public:
const_iterator(){
myList_ = nullptr;
curr_ = nullptr;
}
const_iterator operator++(){}
const_iterator operator++(int){}
const_iterator operator--(){}
const_iterator operator--(int){}
bool operator==(const_iterator rhs){}
bool operator!=(const_iterator rhs){}
const T& operator*()const{}
};
class iterator:public const_iterator{
friend class DList;
iterator(Node* curr, DList* theList):const_iterator(curr,theList){}
public:
iterator():const_iterator(){}
iterator operator++(){}
iterator operator++(int){}
iterator operator--(){}
iterator operator--(int){}
T& operator*(){}
const T& operator*()const{}
};
const_iterator cbegin() const {
return const_iterator(front_,this);
}
iterator begin(){
return iterator(front_,this);
}
const_iterator cend() const{
return const_iterator(nullptr,this);
}
iterator end(){
return iterator(nullptr,this);
}
};
这是我的任务,也是链表的代码,我的任务是为链表实现迭代器类,我刚刚实现了begin和end函数,当我运行测试仪检查那些函数是否起作用时,我返回const_iterator对象时,在这些行的下面显示了错误“从'const DList * const'到'DList *'[-fpermissive]无效转换”。
const_iterator cbegin() const {
return const_iterator(front_,this);
}
const_iterator cend() const{
return const_iterator(nullptr,this);
}
我对此错误消息进行了一些研究,但是没有答案可以帮助我理解问题所在。我不知道为什么会给我这个错误,希望能得到帮助和澄清。
答案 0 :(得分:1)
const_iterator(Node* curr, DList* theList)
接受非const
DList *
,但使用来调用
return const_iterator(front_, this);
通过const
方法
const_iterator cbegin() const
this
方法中的const
是const
,因此这里this
是const DList *
,不能用作期望参数的参数非const
DList *
。
简单的解决方案是替换
const_iterator(Node* curr, DList* theList)
{
curr_ = curr;
myList_ = theList;
}
与
const_iterator(Node* curr, const DList* theList):
curr_(curr),
myList_ (theList) // using member initializer list for reasons of taste
{
}
,并尽可能地遵循const
的正确性。例如,成员
DList* myList_;
必须成为
const DList* myList_;
或者您刚刚移动了错误消息。问题中当前尚未完全实现的其他成员函数可能需要修改。
在我看来这应该是可能的。