找回密码
 FreeOZ用户注册
查看: 1641|回复: 0
打印 上一主题 下一主题

[论坛技术] 类模板与友元的问题/Issue with class template and its friend method

[复制链接]
跳转到指定楼层
1#
发表于 11-5-2009 15:43:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?FreeOZ用户注册

x
泛型是C++的一个非常大的发明,我很喜欢这个发明。但可惜的是,
泛型在各个编译器中的支持各不相同。类模板及其友元的问题应该是其中
一个。我自己没有具体看C++98这类标准,只能从网上找一些片言只字去
了解一下,希望其他同学帮我解释和补充。谢谢

首先我们来看MSDN的一个例子:
http://msdn.microsoft.com/en-us/library/f1b2td24.aspx

例一可以简化为:
  1. template<class T> class X {
  2.   template<class T>
  3.   friend void method(int t, X<T> const & x);
  4. };

  5. template<class T> void method(int t, X<T> const & x) { cout << "hello friend." << endl; }

  6. int main()
  7. {
  8.     X<int> k;

  9.     method(1, k);
  10.     return 0;
  11. }
复制代码
这段代码可以很好地在Visual Studio 8中编译并运行,得到:
hello friend.

这样的结果。但在gcc4中,友元的声明就出错了。
t.cpp:7: error: declaration of 'class T'
t.cpp:6: error:  shadows template parm 'class T'

好在,这里提示的出错是shadow了T这个模板名称,把第二个template<class T>改成template<class T2>,编译就顺利进行了。

例子二中揭示了另一种类模板友元的声明方式,虽然该例中要说明的是另一个问题。根据例二,上面的简化代码可以改成:
  1. template<class T> class X;
  2. template<class T> void method(int t, X<T> const & x);

  3. template<class T> class X {
  4.   friend void method<> (int t, X<T> const & x); //这里不需要重新写template <class T>这样的声明
  5. };

  6. template<class T> void method(int t, X<T> const & x) { cout << "hello friend." << endl; }

  7. int main()
  8. {
  9.     X<int> k;

  10.     method(1, k);
  11.     return 0;
  12. }
复制代码
当然了,例二中最想说明的其实是友元的特例化,也就是:
  1. template<class T> class X {
  2.   friend void method<int> (int t, X<int> const & x); //这里把友元函数特例化成只对T==int时才成立
  3. };
复制代码
如果采用这种方式,在method<T>的实现中就不能访问类X的私有成员了。

例三说明的是类模板的友元类,看起来并不复杂,就不讨论了。

我想补充的时,对于例一,还有一种内嵌的实现方式:
  1. template<class T> class X {
  2.   friend void method(int t, X<T> const & x){ cout << "hello friend." << endl; }
  3. };
复制代码
用这种内嵌的方式,可以把友元的声明简化到和一般的类方法声明并不多,就是多了一个friend关键字。
然而,采用这种方式声明的友元是不可以和实现分离的。

[ 本帖最后由 key 于 17-5-2009 11:20 编辑 ]
回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+10, 13-4-2025 22:29 , Processed in 0.028248 second(s), 17 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表