
Thomas Matelich <matelich@gmail.com> writes:
On Tue, 01 Mar 2005 12:55:21 -0500, David Abrahams <dave@boost-consulting.com> wrote:
Thomas Matelich <matelich@gmail.com> 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