1.全局函数类内实现
直接在类内部实现全局函数,然后再前面加上friend关键字即可,简单好用
此处需要传入对象做函数参数,有3中传入参数的方式:
-
指定传入类型--直接显式指定对象的数据类型
-
参数模板化--将对象中的参数变为模板传入
-
整个类模板化--将这个对象模型 模板化进行传递
类模板中对象做函数参数例子参考这个http://t.csdn.cn/gfodS
此处用到参数模板化传入
#include <iostream>
using namespace std;
#include <string>
//类模板与友元
template <class T1,class T2>
class Person
{
//全局函数类内实现
friend void showInfo2(Person<T1, T2> p) //参数模板化传入
{
cout << "类内实现" << endl;
cout << "姓名: " << p.m_Name << endl;
cout << "年龄: " << p.m_Age << endl;
}
public:
Person(T1 name, T2 age);
private:
T1 m_Name;
T2 m_Age;
};
template <class T1,class T2>
Person<T1, T2>::Person(T1 name, T2 age)
{
this->m_Name = name;
this->m_Age = age;
}
void test01()
{
Person<string, int>p1("Tom", 18);
showInfo2(p1);
}
int main()
{
test01();
system("pause");
return 0;
}
2.全局函数类外实现
这里用到两种对象做参数的传入方式
-
(1)参数模板化
#include <iostream> using namespace std; #include <string> /*-----------------------类外实现-----------------------*/ template <class T1, class T2> //类调用的前置声明 class Person; //全局函数打印类模板中的私有属性-需要作为友元访问其私有属性 template <class T1, class T2> void showInfo1(Person<T1, T2> p) { cout << "类外实现" << endl; cout << "姓名: " << p.m_Name << endl; cout << "年龄: " << p.m_Age << endl; } /*-----------------------类外实现-----------------------*/ //类模板与友元 template <class T1,class T2> class Person { //全局函数类外实现 friend void showInfo1<>(Person<T1,T2> p); //空参数列表表示是函数模板 public: Person(T1 name, T2 age); private: T1 m_Name; T2 m_Age; }; template <class T1,class T2> Person<T1, T2>::Person(T1 name, T2 age) { this->m_Name = name; this->m_Age = age; } void test01() { Person<string, int>p1("Tom", 18); showInfo1(p1); } int main() { test01(); system("pause"); return 0; }
由于全局函数是类外实现,此时需要让编译器提前知道这个函数的存在,故把全局函数的定义提前到类定义的前面;但是由于全局函数中的参数是下面定义的类,所以要把类声明提前到全局函数的定义之前
-
(2)整个类模板化
#include <iostream> using namespace std; #include <string> //类模板与友元 template <class T1, class T2> class Person1 { //全局函数类外实现-类模板化传入 template <class T> friend void showInfo(T& p); //友元全局函数的声明 public: Person1(T1 name, T2 age); private: T1 m_Name; T2 m_Age; }; //构造函数类外实现 template <class T1, class T2> Person1<T1, T2>::Person1(T1 name, T2 age) { this->m_Name = name; this->m_Age = age; } template <class T> void showInfo(T& p) { cout << p.m_Name << endl; cout << p.m_Age << endl; } void test10() { Person1<string, int>p1("Tom", 18); showInfo(p1); } int main() { test10(); system("pause"); return 0; }