c++ - 为什么我不能用我的自定义类型和 uint32_t 重载 &?
问题描述
我在 CAN 方面做了很多工作,为了简化整个应用程序和我同事的 ID,我创建了一个自定义类型:CanId。这种类型简化了 CAN ID 的使用,因为它确定标识符是否有效,并且还处理一些其他功能,例如确定是否使用扩展标识符。
我最近遇到了一个问题,我需要将一些值组合在一起(其中一个是 CanId),并决定在 CanId 中实现此功能。它在大多数情况下都有效,但是我的两个重载具有返回类型uint32_t
,编译器给了我一个有趣的错误:
CanId.hpp:47:18: error: ‘uint32_t Extensions::Can::CanId::operator&(Extensions::Can::CanId&)’ cannot be overloaded
uint32_t operator &(CanId& x) { return id & x.id; }
^~~~~~~~
CanId.hpp:40:18: error: with ‘Extensions::Can::CanId Extensions::Can::CanId::operator&(Extensions::Can::CanId&)’
CanId operator &(CanId& x) { return id & x.id; }
虽然 CanId 可以隐式转换为 uint32_t (和其他一些),但当 I AND 或 OR 某些值时,在某些情况下我需要自动将它们作为 uint32_t - 在重载中具有正确的返回类型似乎更具可读性,而不是将值显式转换回 uint32_t,不是吗?
为什么我不能重载这两种类型/运算符?是因为该类型已经隐式转换为 uint32_t 吗?
operator int32_t() { return id; }
operator uint32_t() { return id; }
解决方案
推荐阅读
- kubernetes - 在Helm 中覆盖子图的值
- kubernetes - Ingress 可以根据 ip 路由请求吗?
- javascript - 代码战争 Persistent Bugger 问题与 if 语句未运行 for-loop
- android - 改造中的 CompositeException
- reactjs - 模拟在反应js中没有状态就无法工作
- vue.js - 监听 Vue 中所有子组件发出的事件
- matlab - 在 MATLAB 中执行 FFT 后的高频杂散
- oracle - 如何使用 SqL ldr 将大小超过 4000 字节的字符串插入 CLOB 类型的表列
- javascript - 如何访问javascript中的每个索引?
- sql-server-2012 - 在 SQL Server(错误日志表)本身中跟踪 SQL Server 存储过程超时异常的最佳方法是什么?