模板类和友元

今天写一个类模板的时候模板类友元函数先是编译不能模板化,再是无法连接,通过看书终于解决了问题
首先模板类的友元函数分为三类:
1,非模板友元函数;
2,约束类模板友元函数,友元函数的类型取决于类被实例化的类型;
3,非约束类模板友元函数,友元的所有具体化都是类的每一个具体化的友元。
首先来看第一类友元函数–非模板友元函数

    template<class T>
    class HasFriend
    {
    public:
        friend void friendFunc1();
        friend void friendFunc2(HasFriend<T> &);
    }
    void friendFunc2(HasFriend<int> & HF){....};
    void friendFunc2(HasFriend<double> & HF){....};

类中有一个friendFunc1()友元函数 这个函数是模板所有实例的友元函数 ,它可以访问全局变量,可以创建HsaFriend类实例来访问所创建的实例内部变量,可以访问模板类的静态成员。
类中含有一个friendFunc2()友元函数,这个函数使用了了一个模板作参数。所以我们必须对这个函数显示具体化(你要用到的类型都得初始化一次)。我最开始的时候就没有这样做然后卡了很久。

接着来看第二类友元函数–约束类模板友元函数

    template<class T>  void friendFunc1();
    template<class T>  void friendFunc2(T &);
    template<class T>
    class HasFriend
    {
    public:
         friend void friendFunc1<T>();
         //friend void friendFunc2<HasFriend<T>>(HasFriend<T> &);
         friend void friendFunc2<>(HasFriend<T> &);
    }
    void friendFunc1()
    {
        .....
    }
    template<class T>  
    void friendFunc2(T &)
    {
        '''''
    }

首先你可以看到类的上部有函数friendFunc1() friendFunc2(T &)函数的定义,这两个函数是模板函数。
然后再类中看两个函数的声明
首先看friend void friendFunc1();这个声明;这个是必须加的
因为它没有参数,所以必须指明是friendFunc1函数模板的一个实例化,注意这个T是类模板的T而不是函数模板的T,这里是将函数进行实例化。
再看 friend void friendFunc2<>(HasFriend &);这个

    template<class T>
    class HasFriend
    {
    public:
         template<class T>  friend void friendFunc1(T &);
    }

这一类在类中定义,他可以访问所有的具体化实例

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值