The following code:
#include <boost/range/adaptor/transformed.hpp>
#include <boost/range/join.hpp>
struct foo {
typedef int result_type;
result_type operator ()(int x) { return x; }
};
int main() {
using boost::adaptors::transformed;
int a[] = {1, 2, 3};
boost::join(a | transformed(foo()), a | transformed(foo()));
return 0;
}
will get a compilation error:
error C2039: 'type' : is not a member of 'boost::range_detail::demote_iterator_traversal_tag<IteratorTraversalTag1,IteratorTraversalTag2>'
1> with
1> [
1> IteratorTraversalTag1=boost::detail::iterator_category_with_traversal<std::input_iterator_tag,boost::random_access_traversal_tag>,
1> IteratorTraversalTag2=boost::detail::iterator_category_with_traversal<std::input_iterator_tag,boost::random_access_traversal_tag>
1> ]
...
in VS2008 with an increase of 1.45.
I plunged into the source code boost::range_detail::demote_iterator_traversal_tagand found that it does not account for boost::detail::iterator_category_with_traversalwhich is being created boost::detail::facade_iterator_category, used iterator_facadeto infer the correct iterator category.
transform_iteratorbased on iterator_facade, so the iterator category a | transformed(foo())is displayed iterator_category_with_traversal<std::input_iterator_tag,boost::random_access_traversal_tag>, but demote_iterator_traversal_tagdoes not recognize it.
I do not understand why it was demote_iterator_traversal_tagcreated in this way. Or maybe it's just a mistake?
Thank.
source
share