首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这是boost::iterator_facade的boost::range_detail::demote_iterator_traversal_tag中的错误吗?

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

Stack Overflow用户
提问于 2010-12-29 01:03:42
回答 2查看 298关注 0票数 3

以下代码:

代码语言:javascript
复制
#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;
}

将得到一个编译错误:

代码语言:javascript
复制
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中使用Boost1.45。

我深入研究了boost::range_detail::demote_iterator_traversal_tag的源代码,发现它没有考虑到boost::detail::iterator_category_with_traversal,它是由boost::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设计成这样。或者也许这只是一个bug?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-26 23:42:48

为了防止将来的Google用户像我一样来到这里,是的,这看起来像是一个bug,因为它至少在1.54版本中得到了修复(可能更快,我用1.44解决了这个bug,并刚刚下载了当前版本)。

票数 0
EN

Stack Overflow用户

发布于 2011-02-24 05:54:54

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。这看起来真的像是个bug。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4547778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档