c++ - 这是 boost::iterator_facade 的 boost::range_detail::demote_iterator_traversal_tag 中的错误吗?

标签 c++ boost iterator

以下代码:

#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_traversalboost::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/

相关文章:

c++ - 如何获取 const* char 参数的键盘输入?

c++ - 从类返回数组

C++ 函数定义和变量声明不匹配?

c++ - 在哪里定义了名称查找规则来查找最直接的名称声明?

c++ - 自动创建继承实例

c++ - 如何将 Boost header 与 Jetbrains Appcode 一起使用

c++ - Boost Signals2将插槽传递给成员函数以进行断开连接

scala - 如何迭代 Spark DataFrame 行?

python - 如何通过使用 for 循环添加现有列表来创建新列表

java - 对于 ArrayList 使用 Iterator 代替 ListIterator 有什么好处?