C++ 类模板与友元

1.全局函数类内实现: 直接在类内声明友元即可

类内void printPerson(Person<T1,T2> p) 添加 friend 为友元 为全局函数,非类内成员函数

复制代码
 1 #include <iostream>
 2 using namespace std;
 3 //通过全局函数 打印Person信息
 4 template<class T1,class T2>
 5 class Person
 6 {
 7     //全局函数类内实现
 8     friend void printPerson(Person<T1, T2> p)
 9     {
10         cout << "Name: " << p.m_Name << "  Age:" << p.m_Age << endl;
11     }
12 public:
13     Person(T1 name, T2 age)
14     {
15         this->m_Name = name;
16         this->m_Age = age;
17     }
18 private:
19     T1 m_Name;
20     T2 m_Age;
21 };
22 void test()//全局函数类内实现
23 {
24     Person<string, int>p("Tom", 11);
25     printPerson(p);
26 }
27 int main()
28 {
29     test();
30     system("pause");
31     return 0;
32 }
复制代码

2.全局函数类外实现:需要提前让编译器知道全局函数的存在

复制代码
 1 #include <iostream>
 2 using namespace std;
 3 //通过全局函数 打印Person信息
 4 //提前让编译器知道Person类的存在
 5 template<class T1,class T2>
 6 class Person;
 7 //类外实现--
 8 template<class T1, class T2>
 9 void printPerson2(Person<T1, T2> p)
10 {
11     cout << "类外实现--姓名" << p.m_Name << "\n类外实现--年龄" << p.m_Age << endl;
12 }
13 template<class T1,class T2>
14 class Person
15 {
16     //全局函数类外实现
17     //加一个空模板的参数列表
18     //如果全局函数是类外实现 需要让编译器提前知道这个函数的存在
19     friend void printPerson2<>(Person<T1, T2> p);
20 public:
21     Person(T1 name, T2 age)
22     {
23         this->m_Name = name;
24         this->m_Age = age;
25     }
26 private:
27     T1 m_Name;
28     T2 m_Age;
29 };
30 
31 void test2()//全局函数类外实现
32 {
33     Person<string, int>p("Ge", 22);
34     printPerson2(p);
35 }
36 int main()
37 {
38     test2();
39     system("pause");
40     return 0;
41 }
复制代码

总结:全局函数尽量做类内实现,用法简单,而且编译器可以直接识别

posted on   廿陆  阅读(6)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示