重载operator<<的迷惑,关于cannot access private member declared in class

今天写C++时,用到了友员重载 << ,但编译是提示cannot access private member declared in class
到网上找了一下解决方案,我发现这个帖子很不错,拿来共享.

这个本是一个初学者问我的一个简单问题,不过最终答案却有点复杂,俺也是“猛然想起”,自己也不知正误,引用于此,并将回复问答抄下,备忘吧。

引用

mGc|TonY.Joe.S重载operator<<的迷惑

#include <iostream>
using namespace std;


class List
{
public:
 friend ostream & operator << (ostream &out,const List &l);
 friend void showdata(List &l);

 List(){data=10;}
 void show(){cout<<data<<endl;}
 
private:
 int data;
 //......
};

void showdata(List &l)
{
 cout<<l.data <<endl;    
}

ostream & operator <<(ostream &out,List &l)
{
 //out<<l.data<<endl;     

 return out;
}

int main()
{
 List l;
 l.show ();
 cout<<l<<endl;
 showdata(l);
 return 0;
}

写这段程序的时候真是很迷惑,你看,operator <<( )和showdata()都是类List的友元函数

为什么showdata()直接访问l的私有数据data没有问题,而operator <<( )访问就要报出下面的错误呢?(编译产生)


C:/Documents and Settings/Administrator/桌面/pailie.cpp(25) : error C2248: 'data' : cannot access private member declared in class 'List'
        C:/Documents and Settings/Administrator/桌面/pailie.cpp(14) : see declaration of 'data'

 

 

以下是问答:

代码之诗:因为你定义 operator << 的时候,参数类型 List 少写一个 const ,所以它的 function signature 发生了变化,编译器认为它与你前面声明的友元不是同一个操作符。

 

mGc|TonY.J

谢谢你,但是我那样改以后在VC++6.0上还是不行,同样的错误.

不过也总算找到错误所在了,只是看起来也很滑稽:

就是把

#include <iostream>
using namespace std;

改成

#include <iostream.h>

。。

解决办法是找到了,不过却更糊涂了!

 

代码之诗:你这个做法不对。这里改后又报别的什么错?

 

代码之诗:哦,我猜……你的VC6没有打上SP4补丁吧?那么它不支持 Kornig 查找。不是你代码的问题,而是编译器太老了。如果不打补丁的话,除非你把这个 operator << 放到 std 命名空间里去。这显然更不妥,还是去打补丁吧。如果可能,换用新的 VC 更好。

 

<script type="text/javascript"></script> <script type="text/javascript"></script> <script src="http://b.bst.126.net/js/utils/InfoAlertPad.js?1" type="text/javascript"></script> <script type="text/javascript"></script> <script type="text/javascript"></script> <script id="visitorInfoJs" src="http://blog.163.com/js/static/visitorInfo.js?host=hotman_x.vip&mode=prev&channel=blog&blogId=fks_085071086080080074083081084095080094088070084087085064&pubTime=1225709611315&v=1255395637578" type="text/javascript"></script>

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值