首页 > 解决方案 > 在 STL 包装类中公开普通和常量迭代器

问题描述

假设我有一个类是 stl::list 的包装器,我希望能够使用范围循环:

 #include <list>
 using std::list;

 template <typename T>
 class list_wrapper
 {
 public:
      list<T> _list;

      typename list<T>::const_iterator begin() { return l.begin(); }
      typename list<T>::const_iterator end() { return l.end(); } 
      typename list<T>::iterator begin() { return l.begin(); }
      typename list<T>::iterator end() { return l.end(); } 
 };

 int main(int argc, char** argv)
 {
      list_wrapper<int> myList;
      // insert any number of elements into myList._list

      /*
           i want to be able to do:

           for (auto& i : myList) { ... }

           and

           for (const auto& i : myList { ... }    
      */

      return 0;
 }

看来我可以使用iterators const_iterators asbegin()并且end()不能重载,并带有错误消息:

 323070236/source.cpp:16:32: error: ‘typename std::__cxx11::list<T>::iterator wrap_list<T>::begin()’ cannot be overloaded
 typename list<T>::iterator begin() { return l.begin(); }
                            ^~~~~
 323070236/source.cpp:14:38: error: with ‘typename std::__cxx11::list<T>::const_iterator wrap_list<T>::begin()’
 typename list<T>::const_iterator begin() { return l.begin(); }
                                  ^~~~~
 323070236/source.cpp:17:32: error: ‘typename std::__cxx11::list<T>::iterator wrap_list<T>::end()’ cannot be overloaded
 typename list<T>::iterator end() { return l.end(); }
                            ^~~
 323070236/source.cpp:15:38: error: with ‘typename std::__cxx11::list<T>::const_iterator wrap_list<T>::end()’
 typename list<T>::const_iterator end() { return l.end(); }

我怎样才能同时使用::iterator::const_iterator在这里?

标签: c++c++11stl

解决方案


推荐阅读