I tried to learn to write stl as iterators, because I wrote a simple circular array and added an iterator to it. Please look at the bottom of the code to see the problem.
template<typename T, int N> class RingQueue{ T * _marray; int _mbegin; int _msize; public: RingQueue(){ _marray = new T[N]; _mbegin = 0; _msize= 0; } void push_back(const T& val){ if(_msize!=N){ _marray[(_mbegin+_msize)%N] = val; _msize++; } else throw "Queue Full"; } T pop_front(){ if(_msize!=0){ T&val = _marray[_mbegin]; _mbegin = (_mbegin+1)%N; _msize--; return val; } else throw "Queue Empty"; } class iterator{ RingQueue<T,N>* _container; int _idx; public: iterator(RingQueue<T,N>* container,int idx):_container(container){ _idx = idx; } bool operator==(iterator &rhs){ return (this->_container==rhs._container && this->_idx == rhs._idx); } bool operator!=(iterator &rhs){ return !(*this==rhs); } T operator*(){ if(_container->_msize>0&&_idx<_container->_msize){ return _container->_marray[(_container->_mbegin+_idx)%N]; } } iterator& operator++(){ if(_container->_msize ==0){ *this = _container->end(); return *this; } if(_idx==_container->_msize){ *this = _container->end(); return *this; } _idx++; return *this; } }; iterator begin(){ return iterator(this,0); } iterator end(){ return iterator(this,_msize); } }; int current=0; int gen(){ return current++; } int curr_op=0; int operation(){ return 2*(curr_op++&1)-1; } int main(){ RingQueue<int,10> ring; vector<int> v(9),op(9); generate(v.begin(),v.end(),gen); random_shuffle(v.begin(),v.end()); copy(v.begin(),v.end(),ostream_iterator<int>(cout," ")); cout<<endl; generate(op.begin(),op.end(),operation); random_shuffle(op.begin(),op.end());
When I compile the part does not work, g ++ unloads the following error
ringqueue.cpp: In function 'int main()': ringqueue.cpp:112: error: no match for 'operator!=' in 'it != ring.RingQueue<T, N>::end [with T = int, int N = 10]()' ringqueue.cpp:48: note: candidates are: bool RingQueue<T, N>::iterator::operator!=(RingQueue<T, N>::iterator&) [with T = int, int N = 10]
part of the work compiles easily when compiled without work. Can someone explain to me what happened.
source share