自定义vector类定义const_iterator编译报错,如何修复?
问题修复方案
错误原因
你遇到的编译错误核心是名字冲突:
在vector类内部,你先定义了typedef iterator<value_type> iterator;,这会把iterator这个名字绑定为vector内部的类型别名(而非全局的模板类)。当后续写iterator<const value_type>时,编译器会认为你在给一个非模板类型传模板参数,直接触发语法错误。
修复方法
方法1:给全局迭代器类改名(推荐)
把你的全局iterator模板类改个独特名字,比如vector_iterator,彻底避免和vector内部的typedef重名:
修改后的iterator类:
template <class T> class vector_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; vector_iterator() : m_ptr(nullptr) {} vector_iterator(pointer ptr) : m_ptr(ptr) {} vector_iterator(const vector_iterator &iter) {m_ptr = iter.m_ptr;} // 补充其他必要的迭代器方法(如operator++、operator*等) };
对应修改vector类里的typedef:
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 vector_iterator<value_type> iterator; typedef vector_iterator<const value_type> const_iterator; typedef std::reverse_iterator<iterator> reverse_iterator; typedef std::reverse_iterator<const_iterator> const_reverse_iterator; typedef typename allocator_type::size_type size_type; typedef typename allocator_type::difference_type difference_type; // 其他vector成员实现 };
方法2:明确指定全局作用域的迭代器模板
如果不想改名,可以在vector内部引用全局迭代器时,加上全局作用域符号::,告诉编译器使用全局的模板类而非内部typedef:
// 在vector类内修改这两行 typedef ::iterator<value_type> iterator; typedef ::iterator<const value_type> const_iterator;
额外注意
你的reverse_iterator需要加上std::前缀——因为你没有自行实现这个模板,默认使用标准库版本,否则编译器会找不到reverse_iterator的定义。
内容的提问来源于stack exchange,提问作者Oussama Oz
相关产品推荐
相关产品推荐

