小技巧:C++限制一个方法只能在某个类当中被调用

一个类A有方法func1,有时候我们希望这个func1只在某个特定的类B中被调用。以下是一种实现方法:

template < class  T >
class  FriendAccess
{
   friend typename T; 
// error if write class keyword instead of typename here, but okay if typename is ignored, why?
   FriendAccess();
}
;

class  B;  //  forward declaration
class  A
{
public:
   
void fun1(FriendAccess<B> fb) const
   
{
      cout 
<< "invoke legally" << endl;
   }
;
}
;
class  B
{
public:
   
void invoke(A* pa) const
   
{
      
if (pa)
         pa
->fun1(FriendAccess<B>());
   }

}
;

因为FriendAccess的ctor被声明为private,所以其只能在template的type param中被构造,A的func1中指定了这个type param只能是B,也就将A::func1的调用范围限定在了B内部。主要原理还是利用了模板和友元的结合。

不过这里比较诡异的是FriendAccess中如果我写friend class T,编译的时候(测试用的是vc2005)居然还是说FriendAccess的ctor无法访问,必须写成typename。然而如果我再写一个特化的FriendAccess<B>版本,其中直接写friend class B,就ok了,诡异!哪位能分析下?

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值