Boost logo

Boost Users :

Subject: Re: [Boost-users] [Iterators] How to implement proxy iterators?
From: Oswin Krause (Oswin.Krause_at_[hidden])
Date: 2012-02-26 16:24:17


Hi,

>> Everything works? That would be really nice!
>>
>
> Well, the only way to be sure is to try it :)
>
> In this case I am happy and thank you very much for the hint to the
>> Definition :). This helped me a lot.
>>
>
> Great. Hopefully everything works out. Let us know if it doesn't.

It doesn't :).

Because I was lazy, I just copy pasted the code and added basic
constructor & op= support to the proxy:

class MatrixRowReference:public MatrixRow{
public:
    MatrixRowReference( Matrix& matrix, std::size_t i)
    :MatrixRow(matrix,i){}

    template<class T>
    const MatrixRowReference& operator=(const T& argument){
        static_cast<MatrixRow&>(*this)=argument;
        return *this;
    }

    operator Vector(){
        return Vector(*this);
    }
};

so, pretty straight forward. The iterator is defined as in the previous
mail with the base class:

struct ProxyIterator: public boost::iterator_facade<
        ProxyIterator,
        Vector,
        boost::random_access_traversal_tag,
        MatrixRowReference
>{...};

The error didn't change. And it is now clear to me, that conversion was
not the Problem in the first place. The quick translated and cleaned error
message reads:

/usr/include/boost/iterator/iterator_facade.hpp: In static element
function »static boost::detail::operator_arrow_result<ValueType,
Reference, Pointer>::type boost::detail::operator_arrow_result<ValueType,
Reference, Pointer>::make(Reference)
[with ValueType = Vector, Reference = MatrixRowReference, Pointer =
Vector*, boost::detail::operator_arrow_result<ValueType, Reference,
Pointer>::type = boost::detail::operator_arrow_proxy<Vector>]«:
[snipping backtrace]
/usr/include/boost/iterator/iterator_facade.hpp:327:49: error: no matching
function for call to »implicit_cast(MatrixRowReference*)«
/usr/include/boost/iterator/iterator_facade.hpp:327:49: note: candidates are:
/usr/include/boost/implicit_cast.hpp:18:10: note: template<class T> T
boost::implicit_cast(typename boost::mpl::identity<T>::type)

looking at the code, it apparently tried to convert MatrixRowReference*
to operator_arrow_proxy<VectorType>

Checking the definition of this proxy, I'm really not sure how this should
work. The compiler might try to call the constructor of
operator_arrow_proxy, but this doesn't seem to be very useful, too:

template <class T>
struct operator_arrow_proxy
{
    operator_arrow_proxy(T const* px);
    //snip
};

im quite sure, that a pointer to my proxy can't be converted to Vector*.

I am still quite certain that the error lies somewhere on my side. So,
what did I do wrong?

Greetings,
Oswin


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net