gpt4 book ai didi

c++ - 我怎样才能同时拥有转换构造函数和转换运算符?

转载 作者:行者123 更新时间:2023-11-27 23:47:55 24 4
gpt4 key购买 nike

考虑这个简单的 C++-17 程序:

#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; }”,程序运行良好。

我想与分数相互转换。我该怎么做才能同时进行转换并仍然编译程序?

最佳答案

从错误中可以看出,编译器正在提示,因为它无法自行解决歧义。正如它正确指出的那样,有 2 种可能的解决方案,如果没有您的额外见解,它不知道该选择哪一种。

你希望(f1 + 2)如何求值,如果你想要Fraction加法,建议将caller改为(f1 + Fraction(2))

如果您想要双重加法,请将其更改为 (double(f1)+2)

最重要的是,您可以继续进行从分数到 double 的转换以及从整数到分数的转换,但是当编译器存在歧义时,您需要明确指定您想要的行为。

关于c++ - 我怎样才能同时拥有转换构造函数和转换运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49092801/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com