類內實現
函數printPerson
雖然是放在類內,但它是一個全局函數。加上friend
修飾,就可以訪問類內的私有屬性。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include <string>
using namespace std;
template<class T1 ,class T2>
class Person
{
//友元函數類內實現
friend void printPerson( Person<T1 ,T2> & p )
{
cout << "姓名:" << p.m_Name << " 年齡: " << p.m_Age << endl;
}
public:
Person(T1 name, T2 age)
{
this->m_Name = name;
this->m_Age = age;
}
private:
T1 m_Name;
T2 m_Age;
};
void test01()
{
Person<string, int> p("Tom", 10);
printPerson(p);//全局函數
}
int main(){
test01();
system("pause");
return EXIT_SUCCESS;
}
類外實現(比較難)
第一步,給普通函數加上<>
變成模樣函數
第二步,讓編譯器看到Person類聲明,讓編譯器提前看到printPerson聲明
第三步,實現函數
完整代碼
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include <string>
using namespace std;
//讓編譯器提前看到printPerson聲明
//讓編譯器看到Person類聲明
template<class T1, class T2> class Person;
template<class T1, class T2>void printPerson(Person<T1, T2> & p);
template<class T1, class T2>
class Person
{
//友元函數類內實現 利用空參數列表 告訴編譯器 模板函數的聲明
friend void printPerson<>(Person<T1, T2> & p); //普通函數 聲明
/*{
cout << "姓名:" << p.m_Name << " 年齡: " << p.m_Age << endl;
}*/
public:
Person(T1 name, T2 age)
{
this->m_Name = name;
this->m_Age = age;
}
private:
T1 m_Name;
T2 m_Age;
};
//類外實現
template<class T1 ,class T2>
void printPerson(Person<T1, T2> & p)
{
cout << "姓名:" << p.m_Name << " 年齡: " << p.m_Age << endl;
}
void test01()
{
Person<string, int> p("Tom", 10);
printPerson(p);
}
int main(){
test01();
system("pause");
return EXIT_SUCCESS;
}
運行,得
姓名:Tom 年齡: 10