God*_*nho 3 c++ operator-overloading operators
我在这里读了几篇关于这种错误的帖子,但我无法解决这个问题......很快我就定义了运算符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&)
Run Code Online (Sandbox Code Playgroud)
班级:
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);
Run Code Online (Sandbox Code Playgroud)
在我的主要:
void func(int n) {
cout << n; //
}
int main(int argc, char** argv) {
//...
d = a + b;
const Fraccao h(7, 3);
func(h);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
您似乎没有发布实际导致错误的代码.我猜它看起来像
Fraccao a;
Fraccao b = a + 4;
Fraccao c = 4 + a;
Run Code Online (Sandbox Code Playgroud)
问题是你的类允许隐式转换来往int; 所以a + 4可能是
int(a) + 4
Run Code Online (Sandbox Code Playgroud)
要么
a + Fraccao(4)
Run Code Online (Sandbox Code Playgroud)
没有理由选择一个而不是另一个.要解决歧义,您可以:
explicit以便只能隐式地进行一次(甚至两次)转换.您有几种方法可以解决您的问题:
int为Fraccao:创建构造函数explicit.禁止隐式转换Fraccao为int:创建转换运算符explicit.
手动转换在呼叫者一侧,给定的Fraccao f; int i;任一int(f)+i或f+Fraccao(i).
提供额外的重载来解决歧义:
Fraccao operator +(const Fraccao &a, const Fraccao &b);
Fraccao operator +(const int a, const Fraccao &b);
Fraccao operator +(const Fraccao &a, const int b);
Run Code Online (Sandbox Code Playgroud)
后者可能意味着你也想要:
Fraccao & operator+=(const Fraccao &fra);
Fraccao & operator+=(const int i);
Run Code Online (Sandbox Code Playgroud)
最后,如果你想要后者,你可以使用像Boost.Operators或我的df.operators这样的库来支持你并避免一遍又一遍地编写相同的转发器.
编译器可以看到两种解释方式a + 4.它可以转换4为类型Fraccao和使用的对象,operator+(const Fraccao&, const Fraccao&)也可以使用成员转换运算符转换a为类型int,并添加4到结果中.重载规则使这种模糊,这就是编译器所抱怨的.一般来说,正如@gx_在评论中所说的那样,这个问题出现了,因为两个方向都有转换.如果你标记operator int()with explicit(C++ 11)代码就没问题.
| 归档时间: |
|
| 查看次数: |
38443 次 |
| 最近记录: |