我试图将我的范围(一对迭代器)转换为iterator_range,以便我可以利用所有 View 和操作。我可以将范围转换为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
}

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

编辑:我正在使用gcc54 -std = c++ 14进行编译。范围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>())>

最佳答案

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

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++;
     ~^~

关于c++ - v3 make_iterator_range要求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43078094/

10-12 18:37