I have classes for linear algebra, specifically vectors and matrices. These contain among others std::vectors (or std::maps) as their 'data' fields.
Iterating over these in a range based for loop is easy. But I'd like to make these fields private and make iterating over my custom classes more natural, such that I can do range based for loops over the class itself.
I tried looking at the function definition of std::vector<>.begin() and such. Then I tried to implement it in such a way that all the iterator objects are forwaded from the std::vector<> fields, but to no avail. When I try to iterate over a constant instance of my class, with the following example;
int main() {
    AlgebraLib::Vector A(4, true);
    A[0] = 4;
    A[1] = 5;
    A[2] = 6;
    A[3] = 7;
    for (auto &&item : A) {
        std::cout << item << std::endl;
    }
    const AlgebraLib::Vector B = A;
    for (auto &&item : B) {
        std::cout << item << std::endl;
    }
    return EXIT_SUCCESS;
}
... I get the following compiler error;
error: passing ‘const AlgebraLib::Vector’ as ‘this’ argument discards qualifiers [-fpermissive]
 for (auto &&item : B) {
Basically, all iterators are defined like this:
std::vector<double>::iterator Vector::begin() {
    return _VectorContents.begin();
}
std::vector<double>::iterator Vector::end() {
    return _VectorContents.end();
}
std::vector<double>::reverse_iterator Vector::rbegin() {
    return _VectorContents.rbegin();
}
std::vector<double>::reverse_iterator Vector::rend() {
    return _VectorContents.rend();
}
std::vector<double>::const_iterator Vector::cbegin() const noexcept{
    return _VectorContents.cbegin();
}
std::vector<double>::const_iterator Vector::cend() const noexcept{
    return _VectorContents.cend();
}
std::vector<double>::const_reverse_iterator Vector::crbegin() const noexcept{
    return _VectorContents.crbegin();
}
std::vector<double>::const_reverse_iterator Vector::crend() const noexcept{
    return _VectorContents.crend();
}
And in my header Vector.hpp:
    // Iterators
    std::vector<double>::iterator begin();
    std::vector<double>::iterator end();
    std::vector<double>::reverse_iterator rbegin();
    std::vector<double>::reverse_iterator rend();
    std::vector<double>::const_iterator cbegin() const noexcept;
    std::vector<double>::const_iterator cend() const noexcept;
    std::vector<double>::const_reverse_iterator crbegin() const noexcept;
    std::vector<double>::const_reverse_iterator crend() const noexcept;
I feel like I'm missing something here? I'm relatively new to C++, and I work at the moment with C++11.
 
    