我正在尝试创建用户定义的类型uint128_t:
class uint128_t{
uint64_t low;
uint64_t hi;
public:
uint128_t(uint64_t val){low=val;hi=0;}
uint128_t operator +(uint128_t n2);
#if DO_I_HAVE_TO_WRITE_ALL_THIS
explicit operator uint64_t(){return low;}
explicit operator uint32_t();
explicit operator uint16_t();
explicit operator uint8_t();
explicit operator int64_t();
explicit operator int32_t();
explicit operator int16_t();
explicit operator int8_t();
#else
operator uint64_t(){return low;}
#endif
};
int main() {
uint128_t x = uint64_t(0) ;
uint16_t y;
x = x + 2; //error: error: ambiguous overload for 'operator+' (operand types are 'uint128_t' and 'int').
y = uint16_t(x);
return 0;
}
如果我使用隐式转换,则强制转换uint128_t时一切正常,但复制构造函数出现歧义错误。
如果我确实使用显式转换,那么一切都会正常,但是我必须编写所有转换-这需要一些工作-否则在投射时会出错。
有没有一种方法告诉编译器更喜欢使用用户定义类型的上转换而不是下转换,而不必编写所有这些显式转换?