mercredi 5 février 2020

Could not convert type C++

I am implementing custom paginator. E.g.

vector<int> v{1,2,3,4};
for (auto page : Paginator(begin(v), end(v), 2)) {
    // For the first iteration i expect {1, 2}, and for the second {3, 4}
}

I have error in my code:

/home/alex/dev/main.cpp:32:28: error: could not convert ‘((Paginator<__gnu_cxx::__normal_iterator > >)this)->Paginator<__gnu_cxx::__normal_iterator > >::data_.std::vector<_Tp, _Alloc>::begin >, std::allocator<__gnu_cxx::__normal_iterator > > >, std::allocator >, std::allocator<__gnu_cxx::__normal_iterator > > > > >()’ from ‘std::vector >, std::allocator<__gnu_cxx::__normal_iterator > > >, std::allocator >, std::allocator<__gnu_cxx::__normal_iterator > > > > >::iterator {aka __gnu_cxx::__normal_iterator >, std::allocator<__gnu_cxx::__normal_iterator > > >, std::vector >, std::allocator<__gnu_cxx::__normal_iterator > > >, std::allocator >, std::allocator<__gnu_cxx::__normal_iterator > > > > > >}’ to ‘__gnu_cxx::__normal_iterator >’ return data_.begin();

My code

template<class IterT>
class Paginator {
public:
    Paginator(IterT begin, IterT end, size_t sz) {
        pageSize_ = sz;
        const size_t dist = distance(begin, end);
        parts_ = dist / pageSize_;
        if (dist % pageSize_ != 0) {
            ++parts_;
        }
        for (int i = 1; i <= parts_; ++i) {
            IterT start = next(begin, (i - 1) * pageSize_);
            IterT finish  = next(begin, i * pageSize_);
            data_.push_back({start, finish});
        }
    }

    size_t size() const {
        return parts_;
    }

    IterT begin() {
        return data_.begin();
    }

    IterT end() {
        return data_.end();
    }


private:
    size_t pageSize_;
    size_t parts_;
    vector<vector<IterT>> data_;
};

template<class T>
void Print(const vector<T>& v) {
    for (auto i : v) {
        cout << i << ' ';
    }
    cout << endl;
}

int main() {
    vector<int> v{1,2,3,4,5,6,7,8,9};


    for (auto i : Paginator<vector<int>::iterator>(begin(v), end(v), 2)) {
        Print(i);
    }
}

Aucun commentaire:

Enregistrer un commentaire