读书人

关于友员的一个奇怪的有关问题

发布时间: 2012-02-24 16:30:39 作者: rapoo

关于友员的一个奇怪的问题
//下面是文件 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。

读书人网 >C++

热点推荐