前言:自从开始学模板了后,小编在练习的过程中。常常一编译之后出现几十个错误,而且还是那种看都看不懂那种(此刻只想一句MMP)。于是写了便写了类模板友元函数的用法这篇博客。来记录一下自己的学习。

普通友元函数的写法:

第一种:(直接上代码吧)

#include <iostream>
#include <string> using namespace std; template<class T>
class Person{
public:
Person(T n)
{
cout << "Person" << endl;
this->name = n;
}
~Person()
{
cout << "析构函数" << endl;
}
//友元函数
/********************************/
template<class T>
friend void print(Person<T> &p);
/*******************************/
private:
T name;
}; //友元函数
template<class T>
void print(Person<T> &p)
{
cout << p.name << endl;
} int main()
{
Person<string>P("XiaoMing");
print(P); system("pause");
return ;
}

第二种方法:

 #include <iostream>
#include <string> using namespace std; //方法二必不可缺的一部分
/**************************************/
template<class T> class Person;
template<class T> void print(Person<T> &p);
/****************************************/
template<class T>
class Person{
public:
Person(T n)
{
cout << "Person" << endl;
this->name = n;
}
~Person()
{
cout << "析构函数" << endl;
}
//友元函数
/********************************/
friend void print<T>(Person<T> &p);
/*******************************/
private:
T name;
}; //友元函数
template<class T>
void print(Person<T> &p)
{
cout << p.name << endl;
} int main()
{
Person<string>P("XiaoMing");
print(P); system("pause");
return ;
}

运算符重载中的友元函数:

方法一:

#include <iostream>
#include <string> using namespace std; template<class T>
class Person{
public:
Person(T n)
{
cout << "Person" << endl;
this->name = n;
}
~Person()
{
cout << "析构函数" << endl;
}
//友元函数
/********************************/
template<class T>
friend ostream& operator<<(ostream &os, Person<T> &p);
/*******************************/
private:
T name;
}; //运算符重载
template<class T>
ostream& operator<<(ostream &os, Person<T> &p)
{
os << p.name << endl;
return os;
} int main()
{
Person<string>P("XiaoMing");
cout << P << endl;
system("pause");
return ;
}

方法二:

#include <iostream>
#include <string> using namespace std; template<class T>
class Person{
public:
Person(T n)
{
cout << "Person" << endl;
this->name = n;
}
~Person()
{
cout << "析构函数" << endl;
}
//友元函数
/********************************/
//template<class T>
friend ostream& operator<<<T>(ostream &os, Person<T> &p);
/*******************************/
private:
T name;
}; //运算符重载
template<class T>
ostream& operator<<(ostream &os, Person<T> &p)
{
os << p.name << endl;
return os;
} int main()
{
Person<string>P("XiaoMing");
cout << P << endl;
system("pause");
return ;
}
05-07 15:41