vc++ 的无语的报错

Superaltman 2009-06-09 02:08:35
error C2804: binary 'operator +' has too many parameters

在类中声明为类的成员函数就报错(operator + 有太多参数)

申明为友元函数就没错

bn_int operator+ (bn_int &a,const unsigned int &b); // 类与数的相加

我又不用访问私有成员变量 有两个参数也要用友元函数? 太bug了吧
...全文
23 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Superaltman 2009-06-09
  • 打赏
  • 举报
回复
友元函数 可以访问它的私有成员变量
但我不想它能访问 又要有两个参数 怎么办
Jalien 2009-06-09
  • 打赏
  • 举报
回复
这个是全局的+,不要在类里面声明。
上面的有一点错误,下面的可以了。


#include<iostream>
using namespace std;

class bn_int{
private:
int a;
public:
bn_int(int i):a(i){}
int getA(){
return a;
}
};

bn_int operator+ (bn_int &a,const unsigned int &b){
return a.getA()+b;
}

int main(){
bn_int a(5);
bn_int b=a+6;
cout<<b.getA()<<endl;
}

vs 2008编译通过。输出结果为11
[Quote=引用 15 楼 Superaltman 的回复:]
楼上的

运算符重载 必须要在类中声明
[/Quote]
ysysbaobei 2009-06-09
  • 打赏
  • 举报
回复
顶下
panch1013518568 2009-06-09
  • 打赏
  • 举报
回复
学习
青岛芒果 2009-06-09
  • 打赏
  • 举报
回复
2楼大哥解释的非常清楚了,我只有顶的份了。呵呵。希望多了解多学习。
amossavez 2009-06-09
  • 打赏
  • 举报
回复
还是二楼说的很明白呀
[quote]
对于运算符重载,运算符被定义为全局函数和成员函数参数个数是不一样的。
对于前者,如果运算符是一元的则一个参数,二元则两个参数。
对于后者,如果运算符是一元的则没有参数,二元则一个参数。
[/uote]
pause123 2009-06-09
  • 打赏
  • 举报
回复
up
Superaltman 2009-06-09
  • 打赏
  • 举报
回复
楼上的

运算符重载 必须要在类中声明
wanghao111 2009-06-09
  • 打赏
  • 举报
回复
重载的+,是不满足数学上的加法交换律的。除非你重载两次。
Qlaiaqu 2009-06-09
  • 打赏
  • 举报
回复
bn_int operator+ (bn_int &a,const unsigned int &b); // 类与数的相加
...................
你在前面加上friend就行了
或者去除第一个变量
Jalien 2009-06-09
  • 打赏
  • 举报
回复
更正:[color=#FF0000]共有访问方法[/color]=公有方法[Quote=引用 13 楼 Jalien 的回复:]
那你就不用友元函数,也不用成员函数。
在类里提供私有变量的共有访问方法.如

C/C++ code
class bn_int{
private:
int a;
public:
int getA(){
return a;
}
..........
};

bn_int operator+ (bn_int &a,const unsigned int &b){
return a.getA()+b;
}
这样就可以不使用友元了。




引用 8 楼 Superaltman 的回复:
友元函数 可以访问它的私有成员变量
但我不想它能访问 又要有…
[/Quote]
Jalien 2009-06-09
  • 打赏
  • 举报
回复
那你就不用友元函数,也不用成员函数。
在类里提供私有变量的共有访问方法.如

class bn_int{
private:
int a;
public:
int getA(){
return a;
}
..........
};

bn_int operator+ (bn_int &a,const unsigned int &b){
return a.getA()+b;
}
这样就可以不使用友元了。

[Quote=引用 8 楼 Superaltman 的回复:]
友元函数 可以访问它的私有成员变量
但我不想它能访问 又要有两个参数 怎么办
[/Quote]
youzhipeng 2009-06-09
  • 打赏
  • 举报
回复
风老二 2009-06-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Jalien 的回复:]
lz啊 这个不是bug啊。
你将其定义为成员函数的话,调用那个+的对象本身就是+的左操作数。
也就是说你这样定义为类成员函数时bn_int operator+ (const bn_int &a); 时,
遇到bn_int a; bn_int b; a+b就会调用 operator+;是在a对象上调用,右操作数是b。

当你定义为友元时,也就是说bn_int operator+ (bn_int &a,const unsigned int &b);(这个是全局的)
这样左操作数是a,右操作数是b;

对于运算符重载,运算符…
[/Quote]
理解了一点
原来 bn_int(这里是a) operator+(const bn_int &a(这里是b))
Jalien 2009-06-09
  • 打赏
  • 举报
回复
lz啊 这个不是bug啊。
你将其定义为成员函数的话,调用那个+的对象本身就是+的左操作数。
也就是说你这样定义为类成员函数时bn_int operator+ (const bn_int &a); 时,
遇到bn_int a; bn_int b; a+b就会调用 operator+;是在a对象上调用,右操作数是b。

当你定义为友元时,也就是说bn_int operator+ (bn_int &a,const unsigned int &b);(这个是全局的)
这样左操作数是a,右操作数是b;

对于运算符重载,运算符被定义为全局函数和成员函数参数个数是不一样的。
对于前者,如果运算符是一元的则一个参数,二元则两个参数。
对于后者,如果运算符是一元的则没有参数,二元则一个参数。


上面的+是二元运算符。

我想lz应该明白了吧?
风老二 2009-06-09
  • 打赏
  • 举报
回复
没看懂
Sou2012 2009-06-09
  • 打赏
  • 举报
回复
UP!。。难道又浊VC6
pengzhixi 2009-06-09
  • 打赏
  • 举报
回复
这 哪是bug,你忘了如果是成员函数,那么就会有个 隐藏的参数this。你看过+号运算符号什么时候有三个参数呢?

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧