Boost logo

Boost Users :

From: David Abrahams (dave_at_[hidden])
Date: 2005-03-07 21:05:52


Thomas Matelich <matelich_at_[hidden]> writes:

> On Tue, 01 Mar 2005 12:55:21 -0500, David Abrahams
> <dave_at_[hidden]> wrote:
>> Thomas Matelich <matelich_at_[hidden]> writes:
>>
>> > I'm a little behind the times and am trying to port my old
>> > iterator_adapters code to use the new library (1.32). We have a class
>> > which is little more than a wrapper around a vector<shared_ptr<T> >,
>> > and I am having a heck of a time with setting its typedef for
>> > reverse_iterator and const_reverse_iterator. I just can't get
>> > const_reverse_iterator to do assignment and comparison with
>> > reverse_iterator.
>> >
>> > I've tried to make indirect_iterators out of the native reverse
>> > iterators,
>>
>> That almost certainly won't work, because the native reverse_iterator
>> usually won't play nicely with the native const_reverse_iterator.
>>
>> > using boost::reverse_iterators of indirect_iterators
>>
>> What happens when you do that? (code, error messages)
>> Have you verified that the const and mutable indirect_iterators
>> interoperate the way you'd like?
>>
>
> So, of course, my sample application (attached) compiles just fine.

No it doesn't:

vc-C++ c:\build\bin\tmp\foo.test\vc7.1\debug-python\threading-multi\foo.obj
foo.cpp
foo.cpp(255) : error C2662: 'TestItem::setItemKey' : cannot convert 'this' pointer from 'const boost::detail::add_pointer_impl<T>::no_ref_type' to 'TestItem &'
        with
        [
            T=const boost::detail::iterator_facade_types<boost::mpl::identity<boost::detail::smart_ptr_pointee<boost::detail::indirect_base<ZUtil::SmartList<TestItem>::native_iterator,boost::use_default,boost::use_default,boost::use_default,boost::use_default>::dereferenceable>::type>::type,boost::mpl::identity<boost::random_access_traversal_tag>::type,boost::mpl::identity<boost::detail::smart_ptr_reference<boost::detail::indirect_base<ZUtil::SmartList<TestItem>::native_iterator,boost::use_default,boost::use_default,boost::use_default,boost::use_default>::dereferenceable>::type >::type ,boost::iterator_difference<ZUtil::SmartList<TestItem>::native_iterator>::type>::value_type
        ]
        Conversion loses qualifiers

But of course, you should have commented out the line that says:

> c_r_iter->setItemKey(33,33); //does compile for new

Then it does compile just fine. Clearly you are doing something
significantly different in your sample application.

> In my failing version
> assigning a rev_iterator to a const_rev_iterator fails with the
> following error:
>
> smartlisttest.cpp(352) : error C2440: 'initializing' : cannot convert
> from 'ZUtil::SmartList<T>::rev_iterator' to
> 'boost::reverse_iterator<Iterator>'
> with
> [
> T=TestItem
> ]
> and
> [
> Iterator=ZUtil::SmartList<TestItem>::const_iterator
> ]
> No constructor could take the source type, or constructor
> overload resolution was ambiguous

Well, it seems as though

   ZUtil::SmartList<TestItem>::rev_iterator

and

   boost::reverse_iterator<ZUtil::SmartList<TestItem>::const_iterator>

must not be the same type in your failing version. If the problem
isn't immediately obvious, I suggest you run your code through the VC8
public beta. Jason Shirk, at my urging, implemented a fix to the
error reporting that will unwind the typedefs in the error message so
you can see what types are actually involved.

 

-- 
Dave Abrahams
Boost Consulting
www.boost-consulting.com

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