Boost logo

Boost :

From: Neal Becker (ndbecker2_at_[hidden])
Date: 2004-09-08 19:16:51


David Abrahams wrote:

> "Neal D. Becker" <ndbecker2_at_[hidden]> writes:
>
>> #include <boost/numeric/ublas/vector.hpp>
>>
>> namespace ublas = boost::numeric::ublas;
>>
>> void F () {
>> ublas::vector<int> u (10);
>> int y = *u.begin();
>> int x = u.begin()[0];
>> }
>>
>> This code fails to compile with g++34 + current boost.cvs.
>>
>> Test.cc:8: error: no match for 'operator[]' in
>> 'boost::numeric::ublas::vector<T, A>::begin() [with T = int, A =
>> boost::numeric::ublas::unbounded_array<int, std::allocator<int> >]()[0]'
>>
>> u.begin() should return an iterator, and the iterator should define
>> operator[]. Why doesn't this work?
>
> If these are (supposedly) random access iterators, it's because the
> ublas people aren't using iterator_facade or iterator_adaptor to
> define them.
>

Actually, I'm having trouble tracing this. AFAICT, in vector.hpp
    // Array based vector class
    template<class T, class A>
    class vector:
...
        typedef typename A::const_iterator const_iterator_type;
        typedef typename A::iterator iterator_type;

So for unbounded_array (the default)
in storage.hpp:
    template<class T, class ALLOC>
    class unbounded_array {
        typedef const T *const_pointer;
        typedef T *pointer;
...
        // Iterators simply are pointers.

        typedef const_pointer const_iterator;

Therefore, const_iterator (or iterator) for vector should just be a pointer
and so [] gets applied to a plain pointer, which should work.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk