2007-3-17 10:42 By WuErPing
首先,C++标准在这个地方定义得不精确,这就给厂商的实现带来了想象的空间。VC和GCC在这里就有不得不注意的差别
代码一、VC的实现(7.1, 8)
代码二、GCC(3.4.4)
比较两个代码的实现,VC的方法显得自然而易于理解,也符合常理,要用到技巧来解决语法问题终归是对程序员的不友好 。 不过没有使用4.0以上的GCC版本,不知道是否有改变。
首先,C++标准在这个地方定义得不精确,这就给厂商的实现带来了想象的空间。VC和GCC在这里就有不得不注意的差别
代码一、VC的实现(7.1, 8)
1 #include <iostream>
2 using namespace std;
3
4 #include <iostream>
5 using namespace std;
6
7 template<typename _T>
8 class MyClass
9 {
10 public:
11 friend _T;
12 private:
13 void PrivatePrint(){ cout << "void PrivatePrint()" << endl;};
14 };
15
16 class MyFriend
17 {
18 public:
19 template<typename _T>
20 void print(MyClass<_T>& my)
21 {
22 my.PrivatePrint();
23 }
24 };
25
26 int _tmain(int argc, _TCHAR* argv[])
27 {
28 MyClass<MyFriend> my;
29 MyFriend myf;
30 myf.print(my);
31 return 0;
32 }
2 using namespace std;
3
4 #include <iostream>
5 using namespace std;
6
7 template<typename _T>
8 class MyClass
9 {
10 public:
11 friend _T;
12 private:
13 void PrivatePrint(){ cout << "void PrivatePrint()" << endl;};
14 };
15
16 class MyFriend
17 {
18 public:
19 template<typename _T>
20 void print(MyClass<_T>& my)
21 {
22 my.PrivatePrint();
23 }
24 };
25
26 int _tmain(int argc, _TCHAR* argv[])
27 {
28 MyClass<MyFriend> my;
29 MyFriend myf;
30 myf.print(my);
31 return 0;
32 }
代码二、GCC(3.4.4)
1 #include <iostream>
2 using namespace std;
3 template <class _T>
4 class ExtractType
5 {
6 public:
7 typedef _T type;
8 };
9
10 template<typename _T>
11 class MyClass
12 {
13 public:
14 friend class ExtractType<_T>::type;
15 private:
16 void PrivatePrint(){ cout << "void PrivatePrint()" << endl;};
17 };
18
19 class MyFriend
20 {
21 public:
22 template<typename _T>
23 void print(MyClass<_T>& my)
24 {
25 my.PrivatePrint();
26 }
27 };
28
29 int main(int argc, char* argv[])
30 {
31 MyClass<MyFriend> my;
32 MyFriend myf;
33 myf.print(my);
34 return 0;
35 }
2 using namespace std;
3 template <class _T>
4 class ExtractType
5 {
6 public:
7 typedef _T type;
8 };
9
10 template<typename _T>
11 class MyClass
12 {
13 public:
14 friend class ExtractType<_T>::type;
15 private:
16 void PrivatePrint(){ cout << "void PrivatePrint()" << endl;};
17 };
18
19 class MyFriend
20 {
21 public:
22 template<typename _T>
23 void print(MyClass<_T>& my)
24 {
25 my.PrivatePrint();
26 }
27 };
28
29 int main(int argc, char* argv[])
30 {
31 MyClass<MyFriend> my;
32 MyFriend myf;
33 myf.print(my);
34 return 0;
35 }
比较两个代码的实现,VC的方法显得自然而易于理解,也符合常理,要用到技巧来解决语法问题终归是对程序员的不友好 。 不过没有使用4.0以上的GCC版本,不知道是否有改变。