不可能的友元函数? 歧义解析

来源:百度知道 编辑:UC知道 时间:2024/06/26 04:51:28
以下代码是用向量存储学生信息。重载了两个<<运算符,可以正常运行。
其中在Student类中有个被注释掉的友元函数声明。问题就在于一旦去掉注释就会发生运算符重载的歧义。为什么会这样?puzzling……
第二个问题是关于insert函数的用法。它有三种形式。我对那个带三个迭带器参数的insert不是很明白。问题在主函数中有注释标记。
祝各位五一节过得愉快~

#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Student
{
public:
Student():itsName("John"),itsAge(18) {}
Student(const string, int );

const string & GetName() const {return itsName;}
int GetAge() const {return itsAge;}
void SetName(const string name) {itsName=name;}
void SetAge(int age) {itsAge=age;}
//friend ostream & operator<<(ostream &,const Student &);
//问题1:为何不能申请友元函数?
private:
string itsName;
int itsAge;
};

Student::Student(const string name,int age):
itsName(name),itsAge(age)
{}

ostream & operator<<(ostream &theStream,const

//这里出了错!!
template <class T>
ostream & operator<<(ostream &theStream,const T &rhs)
//参数里模板应该设为T型.
//模板有点类似于宏代换,你意会吧
{
for(int i=0;i<rhs.size();i++)
theStream<<rhs[i]<<endl;

return theStream;
}

至于insert的定义,是一次定义两次重载所得:
我不想去细看insert实现的细节,这是浪费时间.
类的封装,就是要让使用者可以不关心实现过程,而直接使用结果.你知道这个接口,且知道它的用法,就足够了.

PS:我刚发的,是vector里的原始的定义.

补充:
ourClass.insert(ourClass.begin(),ourClass.begin()+1,ourClass.begin()+3);

这句意思是:
在ouClass.begin()的位置处,插入begin()+1到begin()+3区间的数据.
我定义一个这样一个容器对象,c
则c.insert有以下三种用法:
c.insert(pos,elem)
// 在pos位置插入一个elem拷贝,传回新数据位置。

c.insert(pos,n,elem)
//在pos位置插入n个elem数据。无返回值。

c.insert(pos,beg,end)
//在pos位置插入在[beg,end)区间的数据。无返回值。

问题一:
该运算符要打印Student就要访问其成员,由于类的私有成员不允许类的使用者直接访问,所以重载运算符<<要用友元函数。

至于问题二,我们学校跟你们学校C++版本可能不一样,不太清楚