为什么我的自定义类型和uint32_t无法超载?

时间:2020-05-18 12:34:58

标签: c++ casting operator-overloading overloading

我在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(和其他一些值),但是当我进行AND或OR某些值时,在某些情况下,我需要自动将它们作为uint32_t-在重载中具有正确的返回类型似乎更具可读性,而不是将值显式转换回uint32_t,不是吗?

为什么我不能重载这两种类型/运算符?是因为该类型已经隐式可转换为uint32_t吗?

operator int32_t() { return id; }
operator uint32_t() { return id; }

0 个答案:

没有答案