作为学习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;
};
链接列表为typedef
和iterator
提供了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
?还是我对错误的理解被误导了?
答案 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;