Tworzenie własnego iteratora a zakresowa pętla for

0

Witajcie.
Stworzyłem prosty iterator:

template <typename T, size_t ROW, size_t COL>
struct matrix_iterator
    {
        using iterator_type = typename array<array<T, COL>, ROW>::iterator;
        iterator_type it;
        matrix_iterator(iterator_type iter)
            : it(iter)
        {
            
        }
        
        matrix_iterator(const matrix_iterator&) = default;
        matrix_iterator& operator =(const matrix_iterator&) = default;
        
        matrix_iterator(matrix_iterator&&) = default;
        matrix_iterator& operator =(matrix_iterator&&) = default;
        
        matrix_iterator& operator++()
        {
            ++it;
            return *this;
        }
        
        matrix_iterator& operator--()
        {
            --it;
            return *this;
        }
        
        matrix_iterator operator++(int) {
            auto copy = *this;
            ++it;
            return copy;
        }
        
        matrix_iterator operator--(int) {
            auto copy = *this;
            --it;
            return copy;
        }
        
        bool operator !=(const matrix_iterator& o) const
        {
            return it != o.it;
        }
        
        bool operator ==(const matrix_iterator& o) const
        {
            return !it.operator!=(o);
        }
        
        auto operator *()
        {
            return *it;
        }
        
    };

W klasie matrix zdefiniowałem funkcje begin i end.

matrix_iterator<T, ROW, COL> begin() const
        {
            return {std::begin(matrix_view)};
        }
        
        matrix_iterator<T, ROW, COL> end() const
        {
            return {std::end(matrix_view)};
        }

Sama zmienna matrix_view ma typ

array<array<T, COL>, ROW> matrix_view;

Przy próbie skorzystania z tego iteratora w szablonie:

template <typename T, size_t ROW, size_t COL>
    matrix<T, ROW, COL> operator *(matrix<T, ROW, COL> m, T value)
    {
        for (auto& row : m) {
            std::transform(std::begin(row), std::end(row), std::begin(row), [=](auto elem) {
                return elem * value;
            });
        }
        
        return m;
    }

Otrzymuje błąd:

No matching constructor for initialization of 'matrix_iterator<int, 3UL, 2UL>'

Prośba o pomoc, bo się gryzę z tym a pewnie w kilka minut ogarniecie czego brakuje. :)

2

Całe wieki nie pisałem własnego iteratora. Na pewno brakuje Ci domyślnego konstruktora, który powinien wyznaczać end

matrix_iterator()
            : it{array<array<T, COL>, ROW>::iterator()}
        {
        }

Tylko upewnij się czy konstrukcja array<....>::iterator() faktycznie tworzy Ci poprawnego sentinela.

1

Z tym domyślnym konstruktorem to fakt, dodany.
Ale błąd jak był, tak jest dalej :/

Huh, zapomniałem o strukturze zakresu!

Problem rozwiązany. :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1