全局函數類內實現-直接在類內聲明友元即可
全局函數類外實現-需要提前讓編譯器知道全局函數的存在
#include <iostream>
using namespace std;//通過全局函數來打印Person的信息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;};
//1.全局函數在類內實現
void test01()
{Person<string,int> p("Tom",20);printPerson(p);
}
int main()
{test01();return 0;
}
你看,其實一開始m_Name和m_Age是一個私有的屬性,因為其前面有private關鍵字,因此前面加上friend,也就是友元的全局函數才能訪問這個私有屬性。
全局函數在類外實現的時候
#include <iostream>
using namespace std;//通過全局函數來打印Person的信息
template<class T1,class T2>
class Person{//全局函數,類內實現friend void printPerson2(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;};
//1.全局函數在類內實現
// void test01()
// {
// Person<string,int> p("Tom",20);
// printPerson(p);
// }
//2.全局函數在類外實現,因為這是一個全局函數,因此其沒有必要加作用域
template<class T1,class T2>
void printPerson2(Person<T1,T2> p)
{cout << "類外實現的姓名:" << p.m_Name << " 類外實現的年齡:" << p.m_Age << endl;
}
//全局函數在類外實現的測試
void test02()
{Person<string,int> p("Jerry",28);printPerson2(p);
}
int main()
{test02();return 0;
}
其會出現一個無法解析的錯誤。
friend void printPerson2(Person<T1,T2> p);
這是一個普通函數的函數聲明。
但是下面這是一個函數模版的實現,因此就導致了這兩個不是一個東西。因此我們需要告訴編譯器這是一個函數模版的聲明。
//2.全局函數在類外實現,因為這是一個全局函數,因此其沒有必要加作用域
template<class T1,class T2>
void printPerson2(Person<T1,T2> p)
{cout << "類外實現的姓名:" << p.m_Name << " 類外實現的年齡:" << p.m_Age << endl;
}
#include <iostream>
using namespace std;template<class T1,class T2>
class Person;template<class T1,class T2>
void printPerson2(Person<T1,T2> p)
{cout << "類外實現的姓名:" << p.m_Name << " 類外實現的年齡:" << p.m_Age << endl;
}//通過全局函數來打印Person的信息
template<class T1,class T2>
class Person{//全局函數,類內實現//加空模版的參數列表friend void printPerson2(Person<T1,T2>p){cout << "姓名:" << p.m_Name << " 年齡:" << p.m_Age << endl;}friend void printPerson2<>(Person<T1,T2> p);public:Person(T1 name,T2 age){this->m_Name=name;this->m_Age=age;}private:T1 m_Name;T2 m_Age;};
//1.全局函數在類內實現
// void test01()
// {
// Person<string,int> p("Tom",20);
// printPerson(p);
// }
//2.全局函數在類外實現,因為這是一個全局函數,因此其沒有必要加作用域
template<class T1,class T2>
void printPerson2(Person<T1,T2>& p)
{cout << "類外實現的姓名:" << p.m_Name << " 類外實現的年齡:" << p.m_Age << endl;
}
//全局函數在類外實現的測試
void test02()
{Person<string,int> p("Jerry",28);printPerson2(p);
}
int main()
{test02();return 0;
}
一般沒有特殊需求的話,直接就寫全局函數配合類內實現就完事兒了,用法非常簡單,而且編譯器可以直接識別。