【问题标题】:Is this a bug in boost::range_detail::demote_iterator_traversal_tag of boost::iterator_facade?这是 boost::iterator_facade 的 boost::range_detail::demote_iterator_traversal_tag 中的错误吗?
【发布时间】:2011-05-31 16:07:56
【问题描述】:

以下代码:

#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&lt;std::input_iterator_tag,boost::random_access_traversal_tag&gt;,但demote_iterator_traversal_tag认不出来。

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

谢谢。

【问题讨论】:

  • 您也可以考虑将类似的帖子放在邮件列表中。

标签: c++ boost iterator


【解决方案1】:

万一以后有任何 Google 用户像我一样来到这里,是的,这看起来像是一个错误,因为它至少在 1.54 版本中得到了修复(可能更早,我使用 1.44 遇到了这个错误并刚刚下载了当前版本)。

【讨论】:

    【解决方案2】:

    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。这看起来真的很像一个错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-27
      • 2016-07-09
      • 2014-10-22
      • 1970-01-01
      • 2015-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多