Пользовательский итератор

Я реализовал такой итератор

template <typename GridT, 
          typename GridPtr,
          typename GridRef,
          template <typename> class ShapeT>
class GridIterator
{
public:
    typedef GridIterator<GridT, GridPtr, GridRef, ShapeT> Iterator;

    // Iterator traits - typedefs and types required to be STL compliant
    typedef std::ptrdiff_t            difference_type;
    typedef typename GridT::Element   value_type;
    typedef typename GridT::Element*  pointer;
    typedef typename GridT::Element&  reference;
    typedef size_t                    size_type;
    typedef std::forward_iterator_tag iterator_category;

    GridIterator(GridT& grid,
                 ShapeT<typename GridT::Resolution> shape,
                 Index iterStartIndex);

    ~GridIterator();

    Iterator& operator++();
    Iterator  operator++(int);

    typename GridT::Element& operator*();
    typename GridT::Element* operator->();

    bool operator==(const GridIterator& rhs) const;
    bool operator!=(const GridIterator& rhs) const;


private:

    GridT& grid_;
    ShapeT<typename GridT::Resolution> shape_;
    Index iterIndex_;
    Index iterIndexEnd_;

};

Он отлично работает с std :: generate и std :: find, но когда я использую его с std :: max_element, я получаю его ошибку:

main.cpp: в функции 'int main (int, const char **)': main.cpp: 105: 16: ошибка: 'iter' не был объявлен в этой области В файле, включенном из /usr/include/c++/4.6 / алгоритм: 63: 0, из ./grid/Map_Grid.h:11, из main.cpp: 4: /usr/include/c++/4.6/bits/stl_algo.h: в функции '_FIter std :: max_element (_FIter , _FIter) [с _FIter = Map :: GridIterator, Map :: Grid *, Map :: Grid &, Map :: Rectangle>] ': main.cpp: 102: 53:
создается здесь / usr / include / c ++ / 4.6 / bits / stl_algo.h: 6243: 4: ошибка: использование удаленной функции 'Map :: GridIterator, Map :: Grid *, Map :: Grid &, Map :: Rectangle> & Map :: GridIterator, Map: : Grid *, Map :: Grid &, Map :: Rectangle> :: operator = (const Map :: GridIterator, Map :: Grid *, Map :: Grid &, Map :: Rectangle> &) 'В файле, включенном из ./ grid / Map_Grid.h: 8: 0, из main.cpp: 4: ./grid/Map_GridIterator.h:17:8: error: 'Map :: GridIterator, Map :: Grid *, Map :: Grid &, Map: : Прямоугольник> & Map :: GridIterator, Map :: Grid *, Map :: Grid &, Map :: Re ctangle> :: operator = (const Map :: GridIterator, Map :: Grid *, Map :: Grid &, Map :: Rectangle> &) 'неявно удаляется, потому что определение по умолчанию будет неправильно сформировано: ./grid/Map_GridIterator .h: 17: 8: error: нестатический ссылочный член 'Map :: Grid & Map :: GridIterator, Map :: Grid *, Map :: Grid &, Map :: Rectangle> :: grid_', нельзя использовать значение по умолчанию оператор присваивания

Есть идеи о том, что я делаю неправильно?


person Q-bertsuit    schedule 07.12.2014    source источник
comment
Без реализации невозможно ответить вам. Журнал ошибок указывает только на то, что было выполнено недопустимое назначение копии.   -  person E_net4 the curator    schedule 07.12.2014


Ответы (1)


Оператор присваивания (который, по-видимому, требует max_element) не создается по умолчанию для вашего итератора из-за ссылочного члена

GridT& grid_;

... который нельзя изменить для ссылки на другой GridT объект. Один из простых способов исправить это - вместо этого удерживать сетку за указатель.

person Wintermute    schedule 07.12.2014