1

我正在尝试将我的范围(一对迭代器)转换为,iterator_range以便我可以利用所有视图和操作。我能够将我的范围转换为 boost::iterator_range,但在转换为 range::v3 时出现编译失败。这是一个最小的例子:

struct MyRange
{
    struct iterator_t : std::iterator<std::input_iterator_tag, int>
    {
        friend bool operator==(const iterator_t& lhs, const iterator_t& rhs);
        friend bool operator!=(const iterator_t& lhs, const iterator_t& rhs);
    };
    iterator_t begin() { return iterator_t{}; };
    iterator_t end() { return iterator_t{}; };
};

int main(int argc, char *argv[])
{
    auto my_range    = MyRange{};
    auto boost_range = boost::make_iterator_range(my_range.begin(), my_range.end()); // works
    auto v3_range    = ranges::v3::make_iterator_range(my_range.begin(), my_range.end()); // doesn't compile
}

看起来我需要做一些事情来满足 的Sentinel概念iterator_range,但我无法弄清楚是什么。任何帮助表示赞赏!

编辑:我正在使用 gcc54 -std=c++14 进行编译。range v3/c++ 编译错误有点长,但这里有一个片段:

range-v3/include/range/v3/iterator_range.hpp:171:17: note: in expansion of macro 'CONCEPT_REQUIRES_'
             CONCEPT_REQUIRES_(Sentinel<S, I>())>
             ^
range-v3/include/range/v3/utility/concepts.hpp:669:15: note: invalid template non-type parameter
 >::type = 0                                                                     \
           ^
range-v3/include/range/v3/iterator_range.hpp:171:17: note: in expansion of macro 'CONCEPT_REQUIRES_'
             CONCEPT_REQUIRES_(Sentinel<S, I>())>
4

1 回答 1

2

您的迭代器不是迭代器。它没有取消引用、前置或后增量。

auto my_range    = MyRange{};
auto i           = my_range.begin();
*i;
++i;
i++;

原因:

prog.cc: In function 'int main()':
prog.cc:20:5: error: no match for 'operator*' (operand type is 'MyRange::iterator_t')
     *i;
     ^~
prog.cc:21:5: error: no match for 'operator++' (operand type is 'MyRange::iterator_t')
     ++i;
     ^~~
prog.cc:22:6: error: no 'operator++(int)' declared for postfix '++' [-fpermissive]
     i++;
     ~^~
于 2017-06-11T18:49:34.657 回答