这是boost :: iterator_facade的boost :: range_detail :: demote_iterator_traversal_tag中的错误吗?

时间:2010-12-28 17:03:42

标签: c++ boost iterator

以下代码:

#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;
}

会出现编译错误:

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>        ]
...

在VS2008中,增强1.45。

我深入研究了boost::range_detail::demote_iterator_traversal_tag的源代码,发现它没有考虑boost::detail::iterator_category_with_traversalboost::detail::facade_iterator_category生成iterator_facade来推导出适当的迭代器类别。

transform_iterator基于iterator_facade,因此a | transformed(foo())的迭代器类别推断为iterator_category_with_traversal<std::input_iterator_tag,boost::random_access_traversal_tag>,但demote_iterator_traversal_tag无法识别它。

我不明白为什么demote_iterator_traversal_tag设计得像这样。或者它只是一个错误?

感谢。

2 个答案:

答案 0 :(得分:0)

IteratorTraversalTag1IteratorTraversalTag2来自std::input_iterator_tagboost::random_access_traversal_tag。因此,demote_iterator_traversal_tag应与BOOST_DEMOTE_TRAVERSAL_TAG( random_access_traversal_tag, random_access_traversal_tag, random_access_traversal_tag )匹配。 ::type应该是random_access_traversal_tag。这看起来很像一个错误。

答案 1 :(得分:0)

以防任何未来的Google用户像我一样在这里结束,是的,它看起来像是一个错误,因为它至少在版本1.54中修复(可能更早,我使用1.44点击错误并且刚刚下载了当前版本)。