使用range-v3从迭代器创建subrange失败:无可用构造/推导指南
问题
我希望通过函数返回的两个迭代器创建一个range。参考相关解答后,尝试用range-v3创建新的subrange:
auto [it1, it2] = out_edges(u, _graph); return ranges::subrange(it1, it2) | ranges::views::transform([](auto it){return it->target();});
但编译器报错:
error: no viable constructor or deduction guide for deduction of template arguments of 'subrange'
我无法理解该错误,也不知道应如何定义所需的推导指南。
迭代器类型
迭代器类型定义如下:
class out_edge_iterator : public boost::iterator_adaptor<out_edge_iterator, vertex_descriptor const *, edge_descriptor, forward_traversal_tag, edge_descriptor> { vertex_descriptor const *last; vertex_descriptor source; public: out_edge_iterator(Vertex const *first, Vertex const *last, Vertex source) : out_edge_iterator::iterator_adaptor_(first), last(last), source(source) { BOOST_ASSERT(source != null_vertex()); post_increment(); } private: edge_descriptor dereference() const { return edge_descriptor(source, *this->base_reference()); } void post_increment() { while (this->base_reference() != last && *this->base_reference() == null_vertex()) { this->base_reference()++; } } void increment() { this->base_reference()++; post_increment(); } friend class boost::iterator_core_access; };
配置信息
- 操作系统:Macos Ventura M1
- Apple clang版本:14.0.3 (clang-1403.0.22.14.1)
- 目标架构:arm64-apple-darwin22.5.0
- 线程模型:posix
- range-v3版本:0.12.0
- C标准:C20
解决方法
1. 手动指定subrange模板参数
编译器无法自动推导模板参数,核心原因是out_edge_iterator的特性未被range-v3正确识别。显式指定迭代器和哨兵类型即可绕开推导问题:
auto [it1, it2] = out_edges(u, _graph); return ranges::subrange<out_edge_iterator, out_edge_iterator>(it1, it2) | ranges::views::transform([](auto edge){ return edge.target(); });
注意:原代码中transform的lambda参数存在错误——subrange的迭代器解引用后得到的是edge_descriptor(从迭代器的dereference方法可见),因此应直接调用edge.target()而非it->target()。
2. 确保迭代器满足range-v3概念
out_edge_iterator基于Boost iterator_adaptor实现,需确保它正确暴露了forward迭代器的所有特性。若range-v3无法识别其迭代器类别,可尝试添加迭代器特性特化,或检查Boost配置是否正确适配当前编译环境。
3. 检查编译依赖与选项
确认已正确包含range-v3相关头文件:
#include <range/v3/view/subrange.hpp> #include <range/v3/view/transform.hpp>
同时确保编译选项已开启C++20(如添加-std=c++20参数)。
内容的提问来源于stack exchange,提问作者WaterFox
相关产品推荐
相关产品推荐

