模板类与友元

模板类与友元 

1.模板类与具体化模板参数的友元

 1 #include <iostream>
 2 
 3 template <class T1,class T2>
 4 class A
 5 {
 6 private:
 7     T1 i;
 8     T2 t;
 9     void print()
10     {
11         std::cout << i + t << std::endl;
12     }
13 public:    
14     A(T1 i, T2 t) :i(i), t(t) {}
15     //这里是模板类 与友元函数 调用具体化模板类的演示
16     friend void func(A<int, int>& a);
17 };
18 
19 //这里是模板类 与友元函数 调用具体化模板类的演示
20 void func(A<int, int>& a)
21 {
22     
23     a.print();
24     std::cout << "这里是模板类 与友元函数 调用具体化模板类的演示" << std::endl;
25 }
26 
27 int main()
28 {
29     A<int, int> a(10,20);
30     func(a);
31     return 0;
32 }

2.约束性 友元

 1 //2.约束性 
 2 
 3 #include <iostream>
 4 
 5 template <typename T>
 6 void func(T& a);
 7 
 8 template <class T1,class T2>
 9 class A
10 {
11 private:
12     T1 i;
13     T2 t;
14     void print()
15     {
16         std::cout << i + t << std::endl;
17     }
18 public:    
19     A(T1 i, T2 t) :i(i), t(t) {}
20     //这里是模板类 与友元函数 调用具体化模板类的演示
21     friend void func<>(A<T1,T2>& a);  //约束  这里一定要显示声明 形参的类型
22 };
23 
24 //这里是模板类 与友元函数 调用模板化模板类的演示
25 template <typename T>
26 void func(T& a)
27 {    
28     a.print();
29     std::cout << "这里是模板类 与友元函数 调用模板化模板类的演示" << std::endl;
30 }
31 
32 //这里是模板类 与友元函数 调用具体化模板类的演示
33 template <>
34 void func(A<int, int>& a)
35 {
36     a.print();
37     std::cout << "这里是模板类 与友元函数 调用具体化模板类的演示" << std::endl;
38 }
39 
40 int main()
41 {
42     //这里会优先调用具体化版本
43     A<int, int> a1(10,20);
44     func(a1);
45     //这里会调用模板化版本
46     A<char, int> a2(10, 20);
47     func(a2);
48     return 0;
49 }

3 非约束性 友元与模板类

 1 //3.非约束性 
 2 
 3 #include <iostream>
 4 
 5 template <typename T>
 6 void func(T& a);
 7 
 8 template <class T1,class T2>
 9 class A
10 {
11 private:
12     T1 i;
13     T2 t;
14     void print()
15     {
16         std::cout << i + t << std::endl;
17     }
18 public:    
19     A(T1 i, T2 t) :i(i), t(t) {}
20     //这里是模板类 与友元函数 调用具体化模板类的演示
21     template <typename T> //非约束  这里定义一个模板参数T 来声明 形参类型
22     friend void func<>(T& a);  
23 };
24 
25 //这里是模板类 与友元函数 调用模板化模板类的演示
26 template <typename T>
27 void func(T& a)
28 {    
29     a.print();
30     std::cout << "这里是模板类 与友元函数 调用模板化模板类的演示" << std::endl;
31 }
32 
33 //这里是模板类 与友元函数 调用具体化模板类的演示
34 template <>
35 void func(A<int, int>& a)
36 {
37     a.print();
38     std::cout << "这里是模板类 与友元函数 调用具体化模板类的演示" << std::endl;
39 }
40 
41 int main()
42 {
43     //这里会优先调用具体化版本
44     A<int, int> a1(10,20);
45     func(a1);
46     //这里会调用模板化版本
47     A<char, int> a2(10, 20);
48     func(a2);
49     return 0;
50 }

 

posted on 2026-01-27 14:49  海的寂寞  阅读(0)  评论(0)    收藏  举报

导航