怎樣把函數模板聲明為類模板的友元
給類模板聲明友元的函數模板有三種方式,分別為:
第一種方式,在模板類內部聲明友元的函數模板
第二種方式,在模板類內部聲明對應版本的友元函數模板實例化
需要前置聲明
這種方式是最為合理的方式
第三種方式,在模板類內部直接聲明友元函數,不涉及函數模板
這種情況只能在模板類內部一起把函數的定義寫出來,不能在外部實現,因為外部需要類型參數,而需要類型參數就是模板了
其實這種情況相當于一般的模板類的成員函數,也就是相當于一個函數模板
第二種方式也是一個函數模板,他們保持函數的參數類型和該模板類的實例一個類型
第一種方式更為靈活,他不會要求參數類型與模板類實例是一個類型,但是一般情況下我們也是按照一個類型使用的。
1 #include <iostream>
2 using namespace std;
3
4 //// 第一種方式,在模板類內部聲明友元的函數模板
5 //template <typename T>
6 //class C
7 //{
8 //private:
9 // T m[5];
10 //public:
11 // template <typename U>
12 // friend void foo(const C<U>& T);
13 //};
14 //
15 //template <typename T>
16 //void foo(const C<T>& t)
17 //{
18 // for (int i = 0; i < 5; ++i)
19 // {
20 // cout << t.m[i] << endl;
21 // }
22 //}
23
24 // 第二種方式,在模板類內部聲明對應版本的友元函數模板實例化
25 // 需要前置聲明
26 // 這種方式是最為合理的方式
27 template <typename T>
28 class C;
29
30 template <typename T>
31 void foo(const C<T>& t);
32
33 template <typename T>
34 class C
35 {
36 private:
37 T m[5];
38 public:
39 friend void foo<T>(const C<T>& t);
40 };
41
42 template <typename T>
43 void foo(const C<T>& t)
44 {
45 for (int i = 0; i < 5; ++i)
46 {
47 cout << t.m[i] << endl;
48 }
49 }
50
51 //// 第三種方式,在模板類內部直接聲明友元函數,不涉及函數模板
52 //// 這種情況只能在模板類內部一起把函數的定義寫出來,不能在外部實現,因為外部需要類型參數,而需要類型參數就是模板了
53 //// 其實這種情況相當于一般的模板類的成員函數,也就是相當于一個函數模板
54 //// 第二種方式也是一個函數模板,他們保持函數的參數類型和該模板類的實例一個類型
55 //// 第一種方式更為靈活,他不會要求參數類型與模板類實例是一個類型,但是一般情況下我們也是按照一個類型使用的。
56 //template <typename T>
57 //class C
58 //{
59 //private:
60 // T m[5];
61 //public:
62 // friend void foo(const C<T>& t)
63 // {
64 // for (int i = 0; i < 5; ++i)
65 // {
66 // cout << (t.m[i]) << endl;
67 // }
68 // }
69 //};
70
71 int main()
72 {
73 // C<int> c;
74 C<double> c;
75 foo(c);
76 return 0;
77 }
http://topic.csdn.net/u/20100619/21/c32066bb-dacd-4938-8f95-7345a522b0f6.html
http://topic.csdn.net/u/20100612/13/9365495d-b1d8-4e87-b704-23895acb1637.html
http://www.cnblogs.com/wswqwps/archive/2008/10/25/1319320.html
http://blog.csdn.net/dongzhongshu/archive/2011/02/22/6200466.aspx
posted on 2011-05-27 23:59
unixfy 閱讀(1880)
評論(0) 編輯 收藏 引用