C++ C++;‘的不明确重载;操作员’;

C++ C++;‘的不明确重载;操作员’;,c++,operators,operator-overloading,C++,Operators,Operator Overloading,我在这里读过几篇关于这类错误的帖子,但我没能解决这个问题。。。 很快我就定义了运算符int和函数f,无法编译。 我测试了一些东西,但我没能解决这个问题。。。。 谢谢 ex1.cpp:在函数“int main(int,char**)”中: ex1.cpp:35:13:错误:“a+4”中“operator+”的重载不明确 例1.cpp:35:13:注:候选人为: ex1.cpp:35:13:注:运算符+(int,int) 在ex1中包含的文件中。cpp:3:0: Fraccao.h:41:9:注:F

我在这里读过几篇关于这类错误的帖子,但我没能解决这个问题。。。 很快我就定义了运算符int和函数f,无法编译。 我测试了一些东西,但我没能解决这个问题。。。。 谢谢

ex1.cpp:在函数“int main(int,char**)”中:
ex1.cpp:35:13:错误:“a+4”中“operator+”的重载不明确
例1.cpp:35:13:注:候选人为:
ex1.cpp:35:13:注:运算符+(int,int)
在ex1中包含的文件中。cpp:3:0:
Fraccao.h:41:9:注:Fraccao运算符+(常数Fraccao&,常数Fraccao&)
ex1.cpp:38:13:错误:“4+a”中“operator+”的重载不明确
ex1.cpp:38:13:注:候选人为:
ex1.cpp:38:13:注:运算符+(int,int)
在ex1中包含的文件中。cpp:3:0:
Fraccao.h:41:9:注:Fraccao运算符+(常数Fraccao&,常数Fraccao&)
班级:

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);
类分形{
国际数学家;
int-denominador;
公众:
Fraccao(intnum=0,intdeno=1):numerador(num),denominador(deno){
Fraccao和运算符+=(常数Fraccao和fra);
压裂液和操作员*=(持续压裂液和压裂液);
运算符int()常量;
常量Fraccao&运算符++();
常量Fraccao运算符++(int);
字符串getAsString()常量;
};
Fraccao运算符+(常数Fraccao&a、常数Fraccao&b);

ostream&operator编译器看到两种解释
a+4
的方法。它可以将
4
转换为
Fraccao
类型的对象,并使用
operator+(const-Fraccao&,const-Fraccao&)
或使用成员转换运算符将
a
转换为
int
类型,并将
4
添加到结果中。重载规则使这一点变得模棱两可,这正是编译器所抱怨的。总的来说,正如@gx_uu在一篇评论中所说,出现这个问题是因为在两个方向上都有转换。如果用
explicit
(C++11)标记
运算符int()
,代码就可以了。

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

Fraccao a;
Fraccao b = a + 4;
Fraccao c = 4 + a;
问题是您的类允许在
int
之间进行隐式转换;因此,
a+4
可以是

int(a) + 4

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

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

您有几种解决问题的方法:

  • 禁止从
    int
    Fraccao
    的隐式转换:使构造函数
    显式
  • 禁止从
    Fraccao
    int
    的隐式转换:使转换运算符
    显式

  • 在呼叫者端手动转换,给定
    Fraccao f;int i要么
    int(f)+i
    要么
    f+Fraccao(i)

  • 提供其他重载以解决歧义:

后者可能意味着您还需要:

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

最后,如果您想要后者,您可以使用诸如或my之类的库来支持您,并避免反复编写相同的转发器。

您在哪里声明了a?d=a+b意味着什么?把变量声明放在这里,这样我们就可以知道你在做什么。这就是当你有一个类,它可以隐式地从和转换到
int
…构造函数上的显式函数和Daniel Frey的建议,使操作符接收(Fraccao,int),反之亦然。塔克斯
int(a) + 4
a + Fraccao(4)
Fraccao operator +(const Fraccao &a, const Fraccao &b);
Fraccao operator +(const int a, const Fraccao &b);
Fraccao operator +(const Fraccao &a, const int b);
Fraccao & operator+=(const Fraccao &fra);
Fraccao & operator+=(const int i);