以下代码:
#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中使用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?
谢谢。
发布于 2013-09-26 23:42:48
为了防止将来的Google用户像我一样来到这里,是的,这看起来像是一个bug,因为它至少在1.54版本中得到了修复(可能更快,我用1.44解决了这个bug,并刚刚下载了当前版本)。
发布于 2011-02-24 05:54:54
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。这看起来真的像是个bug。
https://stackoverflow.com/questions/4547778
复制相似问题