重载operator<<的迷惑,关于cannot access private member declared in class
来源:互联网 发布:小数据分析 编辑:程序博客网 时间:2024/05/16 09:12
这个本是一个初学者问我的一个简单问题,不过最终答案却有点复杂,俺也是“猛然想起”,自己也不知正误,引用于此,并将回复问答抄下,备忘吧。
引用
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 更好。
- 重载operator<<的迷惑,关于cannot access private member declared in class
- error C2248: 'CObject::operator =' : cannot access private member declared in class 'CObject'
- error C2248: 'CObject::operator =' : cannot access private member declared in class 'CObject'
- error C2248: 'CObject::operator =' : cannot access private member declared in class 'CObject'
- error C2248: 'CObject::operator =' : cannot access private member declared in class
- error C2248: 'CObject::operator =' : cannot access private member declared in class 'CObject'
- error C2248: 'CObject::operator =' : cannot access private member declared in class 'CObject'
- error C2248: 'CObject::operator =' : cannot access private member declared in class 'CObject'
- error C2248: 'CObject::operator =' : cannot access private member declared in class 'CObject'
- error C2248: cannot access private member declared in class
- c++,vc6.0,中友元函数,无法访问私有字段(private)的问题(problem),cannot access private member declared in class 'Date'
- Qt编译错:cannot access private member declared in class 'QObject'
- error C2248: 'std::basic_ios::basic_ios' : cannot access private member declared in class 'std::basic_ios'
- error C2248: 'CObject::CObject' : cannot access private member declared in class 'CObject'
- error C2248: 'QObject::QObject' : cannot access private member declared in class 'QObject'全解
- Visual C++ error C2248: 'CObject::CObject' : cannot access private member declared in class 'CObject
- CstringArray error C2248: 'CObject::CObject' : cannot access private member declared in class
- error C2248: cannot access protected member declared in class '****'
- SQL2005版本区别详解
- c语言中volatile关键字
- OGNL表达式中的#、%和$
- windows下硬盘安装Ubuntu 9.04 实现Ubuntu 和 windows 双系统共存
- Android 入门,学习中
- 重载operator<<的迷惑,关于cannot access private member declared in class
- 从Java到Ruby——我的最近一次技术转型
- 什么是P问题、NP问题和NPC问题
- Java入门实例classpath及package详解
- Eighteen Things To Remember
- struts2中的异常处理
- 如何识别优秀的程序员?
- API 测试(13)
- 关于主机字节和网络字节的转换方法和理解