以下代码:
#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
设计得像这样。或者它只是一个错误?
感谢。
答案 0 :(得分:0)
IteratorTraversalTag1
和IteratorTraversalTag2
来自std::input_iterator_tag
和boost::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点击错误并且刚刚下载了当前版本)。