|
1
3
2015年更新:
或者,如果您想使用
删除转换运算符。它会一路带来麻烦。具有如下功能
对于手头的问题,存在以下问题:
考虑这个表达式。内置运算符使用转换运算符long double()通过用户定义的类型转换序列匹配第一个参数。但是,您的函数通过从int到long double(整数到浮点转换)的标准转换序列匹配第二个参数。当有两个参数的转换时,它总是模棱两可的,但至少没有一个参数可以更好地转换,而其余的参数在一次调用中转换得更差。在您的例子中,内置参数更好地匹配第二个参数,但第一个参数更差,但是您的函数更好地匹配第一个参数,但第二个参数更差。 这很让人困惑,所以这里有一些例子(从char到int的转换称为升级,这比从char到int以外的东西的转换更好,后者称为转换):
调用第一个版本。因为第一个的所有参数都可以更好地转换。同样,以下内容仍将称为第一个:
因为第一个可以转换得更好,而第二个不会转换得更差。但以下是 模棱两可的 :
在这种情况下更有趣。第一个版本以完全匹配的方式接受第一个参数。第二个版本以完全匹配的方式接受第二个参数。但这两个版本至少不能同样好地接受他们的另一个论点。第一个版本要求对其第二个参数进行转换,而第二个版本要求对其参数进行升级。因此,即使升级比转换更好,对第二个版本的调用也会失败。 这和你上面的情况很相似。即使标准转换序列(从int/float/double转换为long double)是 较好的 与用户定义的转换序列(从MyClass转换为long double)相比,不会选择运算符版本,因为您的其他参数(long double)需要从参数进行转换,这比内置运算符对该参数的转换更差(完全匹配)。 过载解决是C++中的一个复杂问题,所以人们不可能记住它中的所有细微规则。但是得到粗略的计划是很有可能的。我希望它能帮助你。 |
|
|
2
3
通过向
编辑,您已经更新了您的问题,建议将您的转换为长双精度,并将您的比较与整数进行比较。在这种情况下,最后一段应为:
你现在有歧义的原因是因为一个表达式
|
|
|
3
1
我想你是在和文字作比较
如果是这种情况,两种备选方案都一样好/复杂。
用你的
|
|
4
0
你有
|
|
5
0
它是将自己转换成一个双精度的,还是可以与双精度进行比较?使用.greaterThan(double)函数不会达到同样的目的,但不会让用户感到惊讶吗?
(灵感来源于FQA的精彩 rant about operator overloading ) |
|
|
6
0
看起来您已经定义了:
而你却错过了:
也许模板化的函数(或方法)会有所帮助? 注意以下情况: a>=B 调用不同于 b>=A. |
|
|
Noah Wilder · Swift中元组的操作符重载 8 年前 |
|
|
Salman · 指向具有数组索引运算符重载的类的指针 8 年前 |
|
|
Nom OnTheCookie · 使用向量重载C++输出 8 年前 |
|
|
J. Doe · C++重载:从友元函数切换到成员函数 8 年前 |
|
|
Ana · 使用操作符重载添加存储在vector中的类对象 8 年前 |
|
|
Matthew · 重载运算符|用于固定大小的阵列? 8 年前 |
|
|
Martin Žid · 重载运算符+=具有两个类 8 年前 |