C++ C++;‘的不明确重载;操作员’;
我在这里读过几篇关于这类错误的帖子,但我没能解决这个问题。。。 很快我就定义了运算符int和函数f,无法编译。 我测试了一些东西,但我没能解决这个问题。。。。 谢谢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
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);