模板类与友元
模板类与友元
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 }
浙公网安备 33010602011771号