首页 > 解决方案 > 为什么我不能用我的自定义类型和 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; }

标签: c++castingoperator-overloadingoverloading

解决方案


推荐阅读