【发布时间】: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_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 会这样设计。或者它只是一个错误?
谢谢。
【问题讨论】:
-
您也可以考虑将类似的帖子放在邮件列表中。