郁闷死了,我重新发一个:
楼主的问题我也遇见过,自己琢磨后发现这应该是友元的使用不当引起的,希望大家来指教。我把楼主的代码简化了一下,只重载operator<<()输出函数,并把int a,int b声明为private成员(一会可以看到错误)代码如下:
//---------------------------code beings
#include <iostream>
using namespace std;
lass OpoverClass
{
friend ostream& operator<<(ostream&,const OpoverClass&);
public:
OpoverClass (int i=0,int j=0){a=i;b=j;};
private:
int a;
int b;
};
ostream& operator<<(ostream& osObject,const OpoverClass& right)
{
osObject<<"("<<right.a<<","<<right.b<<")";
return osObject;
}
int main()
{
OpoverClass u(23,46);
OpoverClass v;
cout<<"u="<<u<<endl;
return 0;
}
//---------------------------ends
编译以上的代码,编译器会报三个错误:1-operator<< ambiguous 2.cannot access private member 'a' 3.cannot access private member 'b'
问题解决如下:
在using namespace std;之后下一行加上
class OpoverClass;
extern ostream& operator<<(ostream&,const OpoverClass&);
再编译,程序一切正常!
--------------------------
问题所在,都是友元使用不当引发的错误。大家看看 Bjarne Stroustrup的”The C++ Programming
Language”中对友元的说明是这样的:‘一个友元类必须或者是在外围作用域里先行声明的,或者是在将它作为友元的那个类的直接外围的非类作用域里定
义过的。在外围的最内层名字空间作用域之外的作用域不在考虑之列。’所以自己的问题就很明了了。同样,对友元函数的说明也是一样的道理:一个友元函数或者
需要在某个外围作用域里显示声明,否则久无法调用这个友元函数了。具体的请大家看看这本书的P249.
现在问题清楚了吗?
------------------------------
接下来我分析了一下刚提及的三个错误,由于友元使用的不当,导致我们明明声明了函数 ostream&
operator<<(ostream&,const
OpoverClass&);为类OpoverClass的友元,但是仍然不能直接访问类的私有成员。就有了2,3的错误提示!因为由于友元的使
用不当,造成这样的声明friend ostream& operator<<(ostream&,const
OpoverClass&);会有问题,估计编译器把接下来的函数定义
ostream& operator<<(ostream& osObject,const OpoverClass& right)
{
osObject<<"("<<right.a<<","<<right.b<<")";
return osObject;
}
当成了全局函数来看待,全局函数当然是不能直接访问私有成员啦!
至于错误一,operator<<()ambiguous我自己也想不明白,按道理,重载函数参数表中的OpoverClass&
right
.参数是自己定义的类的引用啊,怎么会和std名字空间中原有的输出函数参数表冲突呢(污染名字空间好像也没有吧)。不明白??我不管它,我也把它归结为
是由于之前友元的使用不当引起的!!那为DX知道,麻烦指点一下!~!
------------------------------------
总结:以上的结果是在VC6.0中得出来得,别得编译器我没试过。可能不同得编译器会不一样,看它对C++规范的严格支持程度了。自己之前对友元的理解也很模糊,这才发现自己应该好好看看书了,呵呵~!