‘operator ’ 的 C++ 不明确重载

标签 c++ operators operator-overloading

我在这里阅读了几篇关于此类错误的帖子,但我无法解决这个问题...... 我很快就定义了运算符 int 和函数 f,无法编译。 我测试了几件事,但我无法解决问题.... 谢谢

ex1.cpp: In function ‘int main(int, char**)’:
ex1.cpp:35:13: error: ambiguous overload for ‘operator+’ in ‘a + 4’
ex1.cpp:35:13: note: candidates are:
ex1.cpp:35:13: note: operator+(int, int) <built-in>
In file included from ex1.cpp:3:0:
Fraccao.h:41:9: note: Fraccao operator+(const Fraccao&, const Fraccao&)
ex1.cpp:38:13: error: ambiguous overload for ‘operator+’ in ‘4 + a’
ex1.cpp:38:13: note: candidates are:
ex1.cpp:38:13: note: operator+(int, int) <built-in>
In file included from ex1.cpp:3:0:
Fraccao.h:41:9: note: Fraccao operator+(const Fraccao&, const Fraccao&)

类(class):

class Fraccao {
    int numerador;
    int denominador;

public:
    Fraccao(int num = 0, int deno = 1) : numerador(num), denominador(deno) {}

    Fraccao & operator+=(const Fraccao &fra);

    Fraccao & operator*=(const Fraccao &fra);

    operator int() const;

    const Fraccao & operator++();
    const Fraccao operator++(int);

    string getAsString() const;
};

Fraccao operator +(const Fraccao &a, const Fraccao &b);
ostream & operator<<(ostream & saida, const Fraccao & fra);

在我的主页面上:

void func(int n) {
    cout << n; // 
}

int main(int argc, char** argv) {
    //...
    d = a + b;
    const Fraccao h(7, 3);
    func(h);

    return 0;
}

最佳答案

您似乎没有发布实际导致错误的代码。我猜它看起来像

Fraccao a;
Fraccao b = a + 4;
Fraccao c = 4 + a;

问题是您的类允许与int 之间的隐式转换;所以 a + 4 可以是

int(a) + 4

a + Fraccao(4)

没有理由选择一个而不是另一个。要解决歧义,您可以:

  • 使转换显式,如上所述;或
  • 声明构造函数或转换运算符(或什至两者)显式,以便只能隐式完成一个(甚至两者都不)转换。

关于 ‘operator ’ 的 C++ 不明确重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19819130/

相关文章:

python - 为什么要使用operator模块中的函数?

c++ - 重载 = 运算符悖论

c++ - 几个直方图的平均直方图

javascript - 如何处理除法运算符的溢出

c++ - 在旧的 C++ 中实现基于范围的 for

java - 何时以及为何使用或等于 (|=) 速记运算符

c++ - 类指针类和 ->* 运算符

C++:具有指向抽象基类的动态指针数组的类的赋值运算符

c++ - 基于签名的 C++ 搜索

c++ - RDP客户端-实现时间