在没有模板的情况下推导出冲突类型
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);
模板类型 T
从 v
和 int
从 0
和 1234
推导出 Value
。
鉴于类型冲突,您会收到错误消息。
如果你显式模板类型
// .......VVVVV
std::clamp<int>(v, 0, 1234);
没有更多的推导,编译器期望在第一个位置有一个 int
,所以 operator int ()
被调用超过 v
。
我正在尝试创建一个可以存储 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);
模板类型 T
从 v
和 int
从 0
和 1234
推导出 Value
。
鉴于类型冲突,您会收到错误消息。
如果你显式模板类型
// .......VVVVV
std::clamp<int>(v, 0, 1234);
没有更多的推导,编译器期望在第一个位置有一个 int
,所以 operator int ()
被调用超过 v
。