没有模板的推论冲突类型

问题描述

我正在尝试创建一个可以存储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 { /*...*/ }
}

当我尝试使用“推定的冲突类型”时出现错误。我在某处读到“推导指南”可以提供帮助,但似乎需要模板。我的类型不需要模板。

是否有一种解决方案可以使用此Value类型,而不必每次都将其强制转换为int,double或uint?

Value v;
v=123;

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

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

操作员也遇到同样的问题(带有不同的错误消息)

int x=v+12;

我认为我应该增加更多的运算符重载,但是我找不到哪个。

解决方法

//我想输入:

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

尝试

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

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

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

因此,如果您在不重复T的情况下调用它,

 std::clamp(v,1234);

TValue,从vint推论0,模板类型1234

鉴于类型冲突,您会得到一个错误。

如果您明确指定模板类型

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

没有更多的推论,编译器期望int处于第一位置,因此operator int ()v调用。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...