自定义链接列表const_iterator无法遍历列表的非const实例

时间:2018-07-17 23:50:39

标签: c++ iterator

作为学习C ++的一种练习,我正在尝试为链接列表编写自定义迭代器。

使用以下struct添加列表中的节点:

template <class T> struct Node {
  T val;
  Node* next;
  Node* prev;
  Node(const T& new_val): val(new_val), next(0), prev(0) { }
};

这是迭代器的相关部分:

template <class T> class LList_iterator {
public:
  //...
  LList_iterator(Node<T>* p): node(p) { }
  //...
private:
  Node<T>* node;
};

链接列表为typedefiterator提供了const_iterator

template <class T> class LList {
public:
  typedef LList_iterator<T> iterator;
  typedef LList_iterator<const T> const_iterator;

  iterator begin() { return iterator(head); }
  const_iterator cbegin() const { return const_iterator(head); }

  iterator end() { return iterator(0); }
  const_iterator cend() const { return const_iterator(0); }
  //...
private:
  Node<T>* head;
};

我可以正确使用iterator,但是每当我调用const_iterator的构造函数并将指针传递到(非const)链接列表中的第一个节点时,编译器都会引发错误(当我致电cbegin()cend()时):

LList<int> l;
l.push_back(10);
for (LList<int>::const_iterator i = l.cbegin(); i != l.cend(); ++i)
  std::cout << *i << std::endl;
  

错误:Node<int> *const没有强制转换的功能样式   到LList<int>::const_iterator(又名LList_iterator<const int>

我认为这可能是因为Node const_iterator )期望的const int类型与我正在遍历的列表中的类型不同输入int)。如果是这种情况,我是否有办法“暂时”将LList模板参数转换为const int?还是我对错误的理解被误导了?

1 个答案:

答案 0 :(得分:2)

我认为您需要这样做:

template <class T> class LList_const_iterator {
public:
  //...
  LList_iterator(const Node<T>* p): node(p) { }
  //...
private:
  const Node<T>* node;
};

并更改您的typedef

// from
typedef LList_iterator<const T> const_iterator;
// to
typedef LList_const_iterator<T> const_iterator;