我在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; }