我试图将我的范围(一对迭代器)转换为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
}
看来我需要做一些事情来满足
Sentinel
的iterator_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/