关于模板化的friend class

    2007-3-17 10:42   By WuErPing

    首先,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          }

    代码二、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          }

比较两个代码的实现,VC的方法显得自然而易于理解,也符合常理,要用到技巧来解决语法问题终归是对程序员的不友好 。 不过没有使用4.0以上的GCC版本,不知道是否有改变。

你可能感兴趣的:(关于模板化的friend class)