Home > Software engineering >  typedef iterator<const value_type> const_iterator;
typedef iterator<const value_type> const_iterator;

Time:09-21

I want to create a vector from Zero and this requires creating an iterator class as well, but I have this problem when I want to set a const iterator That's my vector

template < class T, class Alloc = std::allocator<T> > class vector {
        public:
            typedef T                                               value_type;
            typedef Alloc                                           allocator_type;
            typedef T*                                              pointer;
            typedef T const *                                       const_pointer;
            typedef T&                                              reference;
            typedef T const &                                       const_reference;
            typedef iterator<value_type>                            iterator;
            typedef iterator<const value_type>                      const_iterator;
            typedef reverse_iterator<iterator>                      reverse_iterator;
            // typedef reverse_iterator<const_iterator>                const_reverse_iterator;
            typedef typename allocator_type::size_type              size_type;
            typedef typename allocator_type::difference_type        difference_type;

and that's my iterator class

template <class T> class iterator {
        protected:
            T* m_ptr;
        public:
            typedef T                   value_type;
            typedef value_type*         pointer;
            typedef value_type* const   const_pointer;
            typedef value_type&         reference;
            typedef value_type const & const_reference;
            typedef std::ptrdiff_t           difference_type;

            iterator() : m_ptr(nullptr) {}
            iterator(pointer ptr) : m_ptr(ptr) {}
            iterator(const iterator &iter) {m_ptr = iter.m_ptr;}

The error:

./vector.hpp:17:29: error: expected member name or ';' after declaration specifiers
            typedef iterator<const value_type>                      const_iterator;

Any help plz, It's been 3 days and I can't find the solution, thanks

CodePudding user response:

You're trying to redefine the template to a concrete type:

typedef iterator<value_type>                            iterator;

I suggest renaming the class template to something else, like iterator_impl:

template <class T> class iterator_impl {
    protected:
        T* m_ptr;
    public:
        typedef T                   value_type;
        typedef value_type*         pointer;
        typedef value_type* const   const_pointer;
        typedef value_type&         reference;
        typedef value_type const &  const_reference;
        typedef std::ptrdiff_t      difference_type;

        iterator_impl() : m_ptr(nullptr) {}
        iterator_impl(pointer ptr) : m_ptr(ptr) {}
        iterator_impl(const iterator_impl &iter) : m_ptr{iter.m_ptr} {}
};

Then this'll work:

template < class T, class Alloc = std::allocator<T> > class vector {
    public:
        typedef T                                         value_type;
        typedef Alloc                                     allocator_type;
        typedef T*                                        pointer;
        typedef T const *                                 const_pointer;
        typedef T&                                        reference;
        typedef T const &                                 const_reference;
        typedef iterator_impl<value_type>                 iterator;
        typedef iterator_impl<const value_type>           const_iterator;
        typedef std::reverse_iterator<iterator>           reverse_iterator;
        // typedef reverse_iterator<const_iterator>       const_reverse_iterator;
        typedef typename allocator_type::size_type        size_type;
        typedef typename allocator_type::difference_type  difference_type;
};
  • Related