Я пытаюсь преобразовать класс итератора, который должен быть совместим с stl, чтобы его можно было использовать с алгоритмами stl. В следующем простом (и откровенно бесполезном) примере, который должен печатать значения от 0 до 5 включительно, я получаю следующие ошибки:
ISO C++ запрещает увеличивать указатель типа Iterator (*)()
а также,
неверное преобразование из Iterator (*)() в int
Что я делаю не так?
Спасибо.
#include <iterator>
#include <algorithm>
#include <iostream>
class Iterator : public std::iterator<std::bidirectional_iterator_tag, int> {
public:
Iterator(int i = 0) : val(i) {
if(val<0 || val>5) throw;
}
bool operator==(Iterator const& rhs) const {
return (val==rhs.val);
}
bool operator!=(Iterator const& rhs) const {
return !(*this==rhs);
}
Iterator& operator++() {
if(val!=6)
++val;
return *this;
}
Iterator operator++(int) {
Iterator tmp (*this);
++(*this);
return tmp;
}
Iterator& operator--() {
if(val!=-1)
--val;
return *this;
}
Iterator operator--(int) {
Iterator tmp (*this);
--(*this);
return tmp;
}
int operator* () const {
if(val==-1 || val==6) throw;
return val;
}
private:
int val;
};
Iterator begin() {
return Iterator();
}
Iterator end() {
return ++Iterator(5);
}
void print(int i) {
std::cout << i << std::endl;
}
int main(int argc, char* argv[]) {
std::for_each(begin,end,print);
}
throw()
, если хочет, чтобы функция ничего не выдавала. Например, вы бы не хотели, чтобы деструктор класса что-либо выбрасывал. Так что есть мера предосторожности, которую можно использоватьthrow()
. 06.07.2010throw()
не помогает. Такжеthrow()
не подразумевает никаких проверок времени компиляции, он просто завершит программу, если функция все равно сработает. 06.07.2010