You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++20 ranges自定义view通过管道符接入其他view时出现编译错误

问题原因
  • 1 自定义add_constant_view对std::ranges::view_interface采用了默认private继承,导致标准库无法识别该类型为合法的std::ranges::view,不满足标准view适配器的管道调用约束
  • 2 迭代器实现存在两处逻辑错误:
    • 迭代器value_type错误定义为std::ranges::range_difference_t<base_t>,应该用range_value_t
    • 迭代器减法运算符错误套了一层std::ranges::distance,两个随机访问迭代器相减本身就返回差值
  • 3 未对外暴露views::add_constant适配器实例,调用时找不到对应符号
修复方案

1 修改继承方式为public

将add_constant_view的继承声明改为:

template<std::ranges::input_range R>
requires std::ranges::view<R>
class add_constant_view : public std::ranges::view_interface<add_constant_view<R>>

2 修复迭代器实现错误

  • 替换迭代器的value_type定义:
using value_type = std::ranges::range_value_t<base_t>;
  • 修正迭代器减法运算符实现:
friend
constexpr auto operator-(const iterator& x, const iterator& y) -> difference_type
{
    return x.m_current - y.m_current;
}

3 暴露适配器到views命名空间

在detail命名空间外添加如下代码:

namespace views {
    inline constexpr detail::add_constant_range_adaptor add_constant{};
}

4 (可选)简化自定义operator|

标准库的管道机制已经可以自动处理合法view的链式调用,你自定义的针对add_constant_range_adaptor_closure的operator|是冗余的,可直接删除,不会影响使用。

验证效果

修复后如下代码可正常编译运行:

#include <vector>
#include <iostream>

int main()
{
    std::vector<int> vec = {0,1,2,3,4,5,6,7,8,9,10};
    auto view = vec | views::add_constant(2) | std::ranges::views::reverse;
    for(auto&& val : view)
        std::cout << val << ",";
    std::cout << "\n";
    // 输出: 12,11,10,9,8,7,6,5,4,3,2,
    return 0;
}

内容的提问来源于stack exchange,提问作者serkan.tuerker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 07:54:00