C++自定义有序LinkedList类实现const_iterator编译错误求助
错误修正说明
核心编译错误修复
- 后置自增运算符参数错误
C++语法规定后置operator++的占位参数必须是int类型,你当前用模板参数T作为参数不符合规范。
修改代码:
// 原代码:const_iterator operator ++ (T) { const_iterator operator ++ (int) { // 替换为int作为占位参数 if (m_ptr == nullptr) { throw out_of_range("out of range"); } const_iterator temp(*this); m_ptr = m_ptr -> next; return temp; }
- 解引用运算符实现错误
m_ptr是Node*类型,直接解引用得到的是Node对象,你需要返回节点中存储的data成员。同时const_iterator的设计初衷是不允许修改元素,返回值应该改为常量引用。
修改代码:
// 原代码:T& operator*() const { return *m_ptr; } const T& operator*() const { return m_ptr->data; }
其他逻辑错误修复
is_in_list函数位置错误
你当前把is_in_list定义在const_iterator类内部,但是函数中访问的head是LinkedList类的成员,迭代器类无法直接访问外层类的成员,需要把这个函数挪到LinkedList类的public区域。begin()/end()返回值不匹配
当前begin()和end()返回的是Node*,虽然可以通过迭代器的构造函数隐式转换,但规范实现应该直接返回const_iterator。同时注意STL规范中end()应该指向最后一个元素的下一个位置(也就是nullptr),你当前的end()实现返回的是最后一个节点,会导致遍历逻辑错误。
修改代码:
const_iterator begin() const { return const_iterator(head); } const_iterator end() const { return const_iterator(nullptr); }
operator!=访问权限错误
你把operator!=定义在const_iterator的private区域,外部代码无法调用,需要挪到public区域。- 节点指针和迭代器的比较逻辑错误
你在is_in_list和remove函数中直接比较Node*和const_iterator,编译器默认没有对应的比较规则,可以给const_iterator增加一个获取内部指针的成员函数:
Node* get_ptr() const { return m_ptr; }
然后把所有curr == it、head == it这类比较逻辑改为curr == it.get_ptr()、head == it.get_ptr()即可。
内容的提问来源于stack exchange,提问作者SpaceNugget
相关产品推荐
相关产品推荐

