#include <iostream>
#include <math.h>
using namespace std;
class Fraction {
public:
int nom;
int den;
Fraction operator+ (const Fraction& other) {
int nn = nom * other.den +
den * other.nom;
int dd = den * other.den;
return Fraction(nn, dd);
}
Fraction(int nn, int dn): nom(nn), den(dn) { }
Fraction(int nn): nom(nn), den(1) { }
operator double() const { return double(nom) / den; }
};
ostream& operator<<(ostream& os, const Fraction& frac) {
return os << frac.nom << '/' << frac.den;
}
int main() {
Fraction f1(1, 4);
cout << "f1 = " << f1 << endl << "f1+2 = " << (f1 + 2) << endl;
return 0;
}
main.cpp:35:52: error: use of overloaded operator '+' is ambiguous (with operand types 'Fraction' and 'int')
cout << "f1 = " << f1 << endl << "f1+2 = " << (f1 + 2) << endl;
~~ ^ ~
main.cpp:17:11: note: candidate function
Fraction operator+ (const Fraction& other) {
^
main.cpp:35:52: note: built-in candidate operator+(double, int)
cout << "f1 = " << f1 << endl << "f1+2 = " << (f1 + 2) << endl;
^
但是,如果删除转换构造函数“fraction(int nn):nom(nn),den(1){}”或转换运算符“operator double()const{return double(nom)/den;}”,程序运行良好。
我想把分数转换成分数和分数。我可以做什么来既有转换,又有程序编译?
从错误来看,编译器正在抱怨,因为它不能自己解决歧义。正如它正确指出的那样,有两种可能的解决方案,如果没有你的额外洞察力,它不知道该选择哪一种。
您希望如何计算(f1+2)
如果您想要分数相加,建议将调用方更改为(f1+Fraction(2))
。
如果您想要双加法,请将其更改为(double(f1)+2)
。
主要内容:转换构造函数,再谈构造函数,对 Complex 类的进一步精简在 C/ C++ 中,不同的数据类型之间可以相互转换。无需用户指明如何转换的称为自动类型转换(隐式类型转换),需要用户显式地指明如何转换的称为强制类型转换。 自动类型转换示例: 编译器对 7.5 是作为 double 类型处理的,在求解表达式时,先将 a 转换为 double 类型,然后与 7.5 相加,得到和为 13.5。在向整型变量 a 赋值时,将 13.5 转换为整数 13,然后赋给 a。整
我正在编写一个 AST 转换,旨在通过使引用端的 setter 也调用拥有端的 setter 来保持双向 JPA 关系的同步。这在调用 时可靠地工作,但是在构造函数中初始化的变量(由于声明中的初始值设定项语句、构造函数中变量或构造函数参数)将不会链接。 为了处理这种情况,我可以打开所有现有的构造函数(以及任何隐式默认构造函数)并添加必要的代码。但是,添加构造函数的一些常见 AST 转换(如 )在阶
我有下面的课:
我有一个下面的例子(布尔类型过于安全): 众所周知,这样的代码包含一个错误:“无法转换’((int)((const A*)this)- 我想说: 由于指定的障碍,我不能简单地将的所有条目替换为我的用户代码中的超级安全的(这是mocked-对象),因为,例如,在使用了上述构造,将其视为隐式转换。类似的障碍并不唯一。
CLANG6、CLANG7和gcc 7.1、7.2和7.3都同意以下代码是有效的C++17代码,但在C++14和C++11下有歧义。MSVC2015和2017也接受它。然而,即使在C++17模式下,GCC-8.1和8.2也拒绝了它: 接受它的编译器选择模板化的显式转换函数。 拒绝它的编译器同意在以下两个方面存在歧义: null 以下是来自(接受代码)的错误:
我通过各种站点了解java不支持多重继承。其中一个原因是为了避免像强制转换和构造函数链接这样的问题。多重继承如何导致Java中的强制转换和构造函数链接问题?有人能举例给我解释一下吗。