范围-V3的错误信息往往是相当可怕的,以至于这一次实际上是最要好:
prog.cc: In lambda function:
prog.cc:16:90: error: no match for call to '(const ranges::v3::yield_from_fn) (std::vector<int>&)'
| ranges::view::for_each([](std::vector<int> num) { return ranges::yield_from(num); })
^
In file included from /opt/wandbox/range-v3/include/range/v3/view.hpp:38:0,
from /opt/wandbox/range-v3/include/range/v3/all.hpp:21,
from prog.cc:1:
/opt/wandbox/range-v3/include/range/v3/view/for_each.hpp:133:17: note: candidate: template<class Rng, int _concept_requires_132, typename std::enable_if<((_concept_requires_132 == 43) || ranges::v3::concepts::models<ranges::v3::concepts::View, T>()), int>::type <anonymous> > Rng ranges::v3::yield_from_fn::operator()(Rng) const
Rng operator()(Rng rng) const
^~~~~~~~
的人有位范围-V3的概念仿真知识层,这个“清楚地”指出,对yield_from
的调用失败,因为您传递给它的参数的类型 - std::vector<int>
- 不符合View
概念。 012(0)
View
概念描述了不拥有其元素的范围子集,因此具有所有操作 - 移动/复制构造/分配,开始,结束和默认构造 - 可在O(1)中计算。范围-V3中的范围组合algrebra仅适用于视图,以避免处理元素生命周期并提供可预测的性能。
yield_from
拒绝std::vector
是你试图传递因为它们不是视图,但是可以容易地提供由(1)在for_each
取矢量作为左值,而不是通过值的观点,和(2)得到的那些view::all
左值[DEMO]:
auto filtered = nums
| ranges::view::for_each([](std::vector<int>& num) {
return ranges::yield_from(ranges::view::all(num)); })
| ranges::view::remove_if([](int i) { return i % 2 == 1; })
| ranges::view::transform([](int i) { return std::to_string(i); });
但是,在这个简单的例子,压扁的范围内的元件的范围的成范围的元素已经在范围-V3特定目的视图:view::join
。你可以使用它[DEMO]:
auto filtered = nums
| ranges::view::join
| ranges::view::remove_if([](int i) { return i % 2 == 1; })
| ranges::view::transform([](int i) { return std::to_string(i); });
什么是不工作呢? – Galik
@Galik以Main.cpp为例:main():: [with auto:1 = std :: vector ]'的实例化中的一长串编译错误: –