以下代码:
#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 中, boost 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
设计成这样。或者这可能只是一个错误?
谢谢。
最佳答案
以防 future 的 Google 用户像我一样最终来到这里,是的,这看起来像是一个错误,因为它至少在 1.54 版本中得到修复(可能更早,我使用 1.44 解决了这个错误并刚刚下载了当前版本).
关于c++ - 这是 boost::iterator_facade 的 boost::range_detail::demote_iterator_traversal_tag 中的错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4547778/