关于友员的一个奇怪的问题
//下面是文件 person.h的内容
#ifndef _PERSON_H_
#define _PERSON_H_
class Screen;
/* class Person */
class Person
{
public:
Person(string strName, string strAddress)
{
m_name = strName;
m_address = strAddress;
}
Person(){}
~Person(){}
string GetName(void) const
{
return m_name;
}
string GetAddress(void) const
{
return m_address;
}
friend ostream& operator < <(ostream&, const Person&);
private:
string m_name;
string m_address;
Screen *m_Pscreen;
};
#endif
/* EOF */
/****************************************************************/
//下面的内容是main.cpp
#include <iostream>
#include <string>
#include <vector>
using namespace std;
#include "person.h "
ostream& operator < < (ostream& out, const Person& MyPerson)
{
out < < MyPerson.m_name < < endl;
return out;
}
void main(void)
{
Person p1( "hhhhh ", "54354 ");
cout < < p1 < < endl;
}
问题:
编译后出现
error C2248: 'm_name ' : cannot access private member declared in class 'Person '
error C2593: 'operator < < ' is ambiguous
但假如将person.h中的
friend ostream& operator < <(ostream&, const Person&);
改成 friend ostream& operator < <(ostream&,Person&);
只会出现第1个错误
为什么会出现这样的情况呢,还有,为什么这里不能访问私有成员呢,
是不是名字空间的问题.
[解决办法]
这是vc6.0的bug,请看:http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/q192/5/39.asp&NoWebContent=1
解决办法有两个:
1、下载sp6,地址:http://www.microsoft.com/downloads/details.aspx?FamilyId=A8494EDB-2E89-4676-A16A-5C5477CB9713&displaylang=en
2、不要使用 using namespace std 及类似的语句!这样在代码中使用std中的类时就得完全限定之了。如:把ostream改成std::ostream。