【发布时间】:2020-01-03 04:38:20
【问题描述】:
我正在尝试在 C++ 中实现我自己的双向链表 (my_list) 代码,特别是我的列表的迭代器类。我的问题是我想进行从迭代器到 const_iterator 的隐式转换,例如代码 my_list::iterator it = l.begin(); 其中 l 是 my_list 的一个实例进行编译。但是,如果我的编译器不抱怨,我找不到这样做的方法。
下面是实现列表节点和迭代器类的代码:
template<class T> class node {
node(const T& t = T()):data(t),next(0),prev(0) {}
T data;
node* next;
node* prev;
friend class my_list<T>;
friend class my_list_iterator<T>;
};
template<class T> class my_list_iterator {
public:
// increment and decrement operators
my_list_iterator operator++();
my_list_iterator operator++(int);
my_list_iterator operator--();
my_list_iterator operator--(int);
// bool comparison iterators
bool operator==(const my_list_iterator& other) const {return pos_==other.pos_;}
bool operator!=(const my_list_iterator& other) const {return pos_!=other.pos_;}
// member access
T& operator*() const {return pos_->data;}
T* operator->() const {return &(pos_->data);}
// implicit conversion to const iterator
operator my_list_iterator<const T>() {return my_list_iterator<const T>(pos_);}
private:
node<T>* pos_;
explicit my_list_iterator(node<T>* p=0):pos_(p) {}
friend class my_list<T>;
};
我省略了 my_list 实现,但如果您认为它相关,我可以包含它。当我测试这段代码时,它不会在 GCC 上编译并出现以下错误:
In file included from test.cpp:2:
my_list.h: In instantiation of ‘my_list_iterator<T>::operator my_list_iterator<const T>() [with T = int]’:
test.cpp:12:49: required from here
my_list.h:37:48: error: no matching function for call to ‘my_list_iterator<const int>::my_list_iterator(node<int>*&)’
operator my_list_iterator<const T>() {return my_list_iterator<const T>(pos_);}
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
my_list.h:40:12: note: candidate: ‘my_list_iterator<T>::my_list_iterator(node<T>*) [with T = const int]’
explicit my_list_iterator(node<T>* p=0):pos_(p) {}
^~~~~~~~~~~~~~~~
my_list.h:40:12: note: no known conversion for argument 1 from ‘node<int>*’ to ‘node<const int>*’
my_list.h:20:25: note: candidate: ‘constexpr my_list_iterator<const int>::my_list_iterator(const my_list_iterator<const int>&)’
template<class T> class my_list_iterator {
^~~~~~~~~~~~~~~~
my_list.h:20:25: note: no known conversion for argument 1 from ‘node<int>*’ to ‘const my_list_iterator<const int>&’
my_list.h:20:25: note: candidate: ‘constexpr my_list_iterator<const int>::my_list_iterator(my_list_iterator<const int>&&)’
my_list.h:20:25: note: no known conversion for argument 1 from ‘node<int>*’ to ‘my_list_iterator<const int>&&’
有人可以帮我解决我做错了什么吗?
【问题讨论】:
-
确认一下,你想要一个不能修改它所代表的对象的迭代器,是吗?
-
很好,迈尔斯。没注意到。
-
这通常使用不同类型的迭代器来完成,而不是使用不同包含类型的相同迭代器。在标准库中,这是使用
iterator和const_iterator执行的,两者都围绕相同的类型进行模板化。 -
@user4581301 是的。我想要一个只读访问迭代器,与 std::list
::const_iterator 的行为方式完全相同。至于您的最后一条评论,我真的需要执行两次代码吗?我基本上是在尝试创建从 iterator 到 iterator 的隐式转换,这不可能吗?
标签: c++ iterator doubly-linked-list const-iterator