在没有模板的情况下推导出冲突类型

Deduced conflicting types without template

我正在尝试创建一个可以存储 int、double 或 uint 的类型,如下所示:

struct Value
{
    /*...*/

    Value& operator=(const int value) { /*...*/ }
    Value& operator=(const double value) { /*...*/ }
    Value& operator=(const uint value) { /*...*/ }

    operator int() const { /*...*/ }
    operator double() const { /*...*/ }
    operator uint() const { /*...*/ }
}

我在尝试使用它时收到有关“推断的冲突类型”的错误。我在某处读到“演绎指南”可以提供帮助,但它似乎需要模板。我的类型不需要模板。

是否有使用此值类型而无需每次都将其转换为 int、double 或 uint 的解决方案?

Value v;
v=123;

// I would like to type:
std::clamp(v,0,1234); // error

// But I need to type:
std::clamp(int(v),0,1234); // ok

我也有与操作员相同的问题(不同的错误消息)

int x=v+12;

我想我应该添加更多的运算符重载,但我没有找到哪一个。

// I would like to type:

std::clamp(v,0,1234); // error

试试

 // .......VVVVV
 std::clamp<int>(v, 0, 1234);

问题是std::clamp()的签名是

 template<class T>
 constexpr const T& clamp( const T& v, const T& lo, const T& hi );

所以如果你调用它而不解释 T,

 std::clamp(v, 0, 1234);

模板类型 Tvint01234 推导出 Value

鉴于类型冲突,您会收到错误消息。

如果你显式模板类型

 // .......VVVVV
 std::clamp<int>(v, 0, 1234);

没有更多的推导,编译器期望在第一个位置有一个 int,所以 operator int () 被调用超过 v