当前位置: 首页 > 知识库问答 >
问题:

如何既有转换构造函数又有转换运算符?

陈君之
2023-03-14
#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;}”,程序运行良好。

我想把分数转换成分数和分数。我可以做什么来既有转换,又有程序编译?

共有1个答案

高修筠
2023-03-14

从错误来看,编译器正在抱怨,因为它不能自己解决歧义。正如它正确指出的那样,有两种可能的解决方案,如果没有你的额外洞察力,它不知道该选择哪一种。

您希望如何计算(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中的强制转换和构造函数链接问题?有人能举例给我解释一下吗。