У меня есть класс Iterator, и я хочу получить элемент управления в этом классе, не имея информации о контейнере (это странно, я знаю, но делаю это как домашнее задание).Итак, я нашел способ сохранить контейнер как переменную-член.
Вот мой шаблон заголовка класса Iterator
template <class E, class C= vector<E> >
class Iterator {
public:
Iterator(C c);
Iterator();
bool hasNext()noexcept;
typename C::iterator& next()noexcept;
void remove()noexcept;
E& operator *()throw(domain_error);
private:
typename C::iterator itr;
C container;
};
и вот мой конструктор Iterator, который инициализирует переменные-члены.
template<class E, class C>
Iterator<E, C>::Iterator(C c) {
container =c;
itr= c.begin();
}
и вот моя проблемная функция Iterator<E,C>::hasNext
template<class E, class C>
bool
Iterator<E,C>::hasNext()noexcept {
return (itr != container.end()); //can not catch end element
}
Из-за того, что функция Iterator::hasNext
не может перехватить конечную точку, в функции hashSet::addAll
возникает бесконечный цикл.(это другой класс, который использовал класс Iterator в качестве вспомогательного класса)
template<class E, class C>
void
HashSet<E, C>::addAll(C &c)noexcept {
Iterator<E,C> itr = Iterator<E,C>(c);
while(itr.hasNext()){
add(*itr);
itr.next();
}
}
hashSet :: add (E e) function
template<class E, class C>
void
HashSet<E, C>::add(E e)noexcept {
if(contains(e)!=true){
// cerr<<"hashSet::add "<< e <<endl;
container.insert(container.end(),e);
}
}