Iterator khusus

Saya telah menerapkan iterator seperti ini

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_;

};

Ini berfungsi baik dengan std::generate dan std::find, tetapi ketika saya menggunakannya dengan std::max_element saya mendapatkan kesalahannya:

main.cpp: Dalam fungsi 'int main(int, const char**)': main.cpp:105:16: error: 'iter' tidak dideklarasikan dalam cakupan ini Dalam file yang disertakan dari /usr/include/c++/4.6 /algorithm:63:0, dari ./grid/Map_Grid.h:11, dari main.cpp:4: /usr/include/c++/4.6/bits/stl_algo.h: Dalam fungsi '_FIter std::max_element(_FIter , _FIter) [dengan _FIter = Map::GridIterator, Map::Grid*, Map::Grid&, Map::Rectangle>]': main.cpp:102:53:
dipakai dari sini /usr/include/ c++/4.6/bits/stl_algo.h:6243:4: error: penggunaan fungsi yang dihapus '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>&)' Dalam file yang disertakan dari ./ grid/Map_Grid.h:8:0, dari main.cpp:4: ./grid/Map_GridIterator.h:17:8: error: 'Map::GridIterator, Map::Grid*, Map::Grid&, Peta: :Rectangle>& Peta::GridIterator, Peta::Grid*, Peta::Grid&, Peta::Rectangle>::operator=(const Peta::GridIterator, Peta::Grid*, Peta::Grid&, Peta:: Rectangle>&)' secara implisit dihapus karena definisi default akan salah bentuk: ./grid/Map_GridIterator.h:17:8: error: anggota referensi non-statis 'Map::Grid& Map::GridIterator, Map:: Grid*, Map::Grid&, Map::Rectangle>::grid_', tidak dapat menggunakan operator penugasan default

Ada ide tentang kesalahan yang saya lakukan?


person Q-bertsuit    schedule 07.12.2014    source sumber
comment
Kedengarannya mustahil menjawab Anda tanpa implementasi. Log kesalahan hanya menunjukkan bahwa penugasan salinan ilegal telah dilakukan.   -  person E_net4 the curator    schedule 07.12.2014


Jawaban (1)


Operator penugasan (yang tampaknya diperlukan max_element) tidak dibuat secara default untuk iterator Anda karena anggota referensi

GridT& grid_;

...yang tidak dapat diubah untuk mereferensikan objek GridT yang berbeda. Salah satu cara mudah untuk memperbaikinya adalah dengan menahan grid dengan pointer.

person Wintermute    schedule 07.12.2014