如何解决没有模板的推论冲突类型
我正在尝试创建一个可以存储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);
从T
和Value
,从v
和int
推论0
,模板类型1234
。
鉴于类型冲突,您会得到一个错误。
如果您明确指定模板类型
// .......VVVVV
std::clamp<int>(v,1234);
没有更多的推论,编译器期望int
处于第一位置,因此operator int ()
被v
调用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。