当前位置: 首页 > news >正文

error: the type ‘const zjloc::<lambda(const Vec2i, const Vec2i)>’

catkin_make 编译时遇到这个问题:

/home/robot/ct_lio/src/ct-lio/src/common/eigen_types.h:114:20: error: the type ‘const zjloc::<lambda(const Vec2i&, const Vec2i&)>’ of ‘constexpr’ variable ‘zjloc::less_vec2i’ is not literal 114 | constexpr auto less_vec2i = | ^~~~ /home/robot/ct_lio/src/ct-lio/src/common/eigen_types.h:114:34: note: ‘zjloc::<lambda(const Vec2i&, const Vec2i&)>’ is not literal because: 114 | constexpr auto less_vec2i = | ^ cc1plus: note: ‘zjloc::<lambda(const Vec2i&, const Vec2i&)>’ is a closure type, which is only literal in C++17 and later In file included from /home/robot/ct_lio/src/ct-lio/src/tools/point_types.h:12, from /home/robot/ct_lio/src/ct-lio/src/preprocess/cloud_convert/cloud_convert.h:9, from /home/robot/ct_lio/src/ct-lio/src/preprocess/cloud_convert/cloud_convert.cc:1: /home/robot/ct_lio/src/ct-lio/src/common/eigen_types.h:114:20: error: the type ‘const zjloc::<lambda(const Vec2i&, const Vec2i&)>’ of ‘constexpr’ variable ‘zjloc::less_vec2i’ is not literal 114 | constexpr auto less_vec2i = | ^~~~ /home/robot/ct_lio/src/ct-lio/src/common/eigen_types.h:114:34: note: ‘zjloc::<lambda(const Vec2i&, const Vec2i&)>’ is not literal because: 114 | constexpr auto less_vec2i =

        这个错误是因为代码中使用了一个 constexpr lambda 表达式 less_vec2i,但 lambda 表达式在 C++11 和 C++14 中并不是字面量类型(literal type),因此不能用于 constexpr 变量的定义。

解决方法:

1.升级到 C++17 或更高版本

        在 C++17 中,lambda 表达式可以成为字面量类型,从而可以用于 constexpr 变量的定义。如果你的编译器支持,可以将代码标准提升到 C++17。

# 在 CMakeLists.txt 中设置编译标准为 C++17
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

2. 使用函数对象代替 lambda 表达式

        如果不能升级到 C++17,可以将 lambda 表达式替换为具有 operator() 的结构体或类。这样的结构体或类可以在 C++11 和 C++14 中作为 constexpr 使用。

struct LessVec2i {constexpr bool operator()(const Vec2i &v1, const Vec2i &v2) const {// Your comparison logic herereturn v1.x() < v2.x() || (v1.x() == v2.x() && v1.y() < v2.y());}
};constexpr LessVec2i less_vec2i;

        然后在需要使用的地方使用 less_vec2i,如:

std::map<Vec2i, int, LessVec2i> my_map;

3. 避免使用 constexpr

        如果不需要在编译时计算结果,可以将 constexpr 移除,将 lambda 表达式普通地定义为一个变量或函数。

auto less_vec2i = [](const Vec2i &v1, const Vec2i &v2) {return v1.x() < v2.x() || (v1.x() == v2.x() && v1.y() < v2.y());
};

        然后在需要使用的地方直接使用 less_vec2i。 

总结

        根据你的项目需要和编译器支持情况,选择适合的解决方案来修复 constexpr lambda 表达式不是字面量类型的问题。通常推荐升级到支持 C++17 的编译器版本,以便能够更好地利用现代 C++ 的特性。

相关文章:

  • JAVA NIO(二) Buffer和Channel
  • Elasticsearch:倒数排序融合 - Reciprocal rank fusion - 8.14
  • go的有栈和无栈
  • C#开发-集合使用和技巧(一)常用集合和方法介绍
  • 设计模式——访问者模式
  • python从入门到精通1:注释
  • Android 屏幕适配
  • python_根据关键词匹配文件中的数据并绘图
  • python学习—字典(Dictionary)
  • 【自动驾驶】运动底盘状态数据:里程计、IMU、运动学分析、串口通信协议
  • 计算机组成原理网课笔记2
  • 【刷力扣】23. 合并 K 个升序链表(dummy节点技巧 + 分治思维 + 优先队列)
  • 番外篇 | YOLOv8算法解析和实战应用:车辆检测 + 车辆追踪 + 行驶速度计算
  • 【shell脚本速成】函数
  • 五十三、openlayers官网示例Layer Spy解析——跟随鼠标透视望远镜效果、图层剪裁
  • 【node学习】协程
  • 0基础学习移动端适配
  • 2017 前端面试准备 - 收藏集 - 掘金
  • angular学习第一篇-----环境搭建
  • EventListener原理
  • JSDuck 与 AngularJS 融合技巧
  • storm drpc实例
  • Vue 重置组件到初始状态
  • 初识MongoDB分片
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 搭建gitbook 和 访问权限认证
  • 仿天猫超市收藏抛物线动画工具库
  • 关于extract.autodesk.io的一些说明
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 前端js -- this指向总结。
  • 区块链将重新定义世界
  • 使用Gradle第一次构建Java程序
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 用mpvue开发微信小程序
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • # Kafka_深入探秘者(2):kafka 生产者
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • #宝哥教你#查看jquery绑定的事件函数
  • (¥1011)-(一千零一拾一元整)输出
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
  • (C语言)fgets与fputs函数详解
  • (python)数据结构---字典
  • (翻译)terry crowley: 写给程序员
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (十三)Flink SQL
  • (一)认识微服务
  • (已解决)什么是vue导航守卫
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .NET Core 通过 Ef Core 操作 Mysql
  • .Net FrameWork总结