类模板的友元

文章介绍了C++中类模板的友元的不同形式,包括普通类作为类模板的友元、特化版类模板作为另一个类模板的友元以及泛化版类模板作为另一个类模板的友元。通过示例代码展示了友元如何访问类模板的私有成员,并讨论了类类型参数作为友元的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++的泛型编程真的是复杂,最近再看一些代码的时候涉及一些模板相关的地方,有的写法因为自己没咋用过看着就很陌生,这节就聊聊类模板的友元的各个形式写法。

有关模板的文章之前写过一个可变参数的,感兴趣的可以看看 C++泛型编程:可变参数模板_​​​​​​

先来看下普通类作为类模板的友元 

写之前给不知道友元的小伙伴说一声:友元不受public/private影响,他只是定义在类外部的普通函数或类,可以访问类中private成员;友元声明只能出现在类定义中 ,在外面去定义实现

这是一个普通类的写法

template<class T>
class Base{
private:
	T _id;   
    friend class A;
};

class A{
public:
    void fun1(){
        Base<int>base;
        base._id=1;
        cout<<base._id<<endl;
    }
};

int main()
{
    A a;
    a.fun1();
    return 0;
}
 

除了上面最普通的,还有3种情况

  • 特化版类模板作为另外一个类模板的友元
  • 泛化版类模板作为另一个类模板的友元

 特化版类模板作为另外一个类模板的友元

template<typename TT> class A;

template<typename T>
class Base{
private:
	T _id;   
    friend A<double> ;//double版的A才有权限
};

template<typename TT>
class A{
public:
    void fun1(){
        Base<double>base;
        base._id=2.50;
        cout<<base._id<<endl;
    }
};

int main()
{
    A <double>a;//必须和Base中friend指定的参数一致
    a.fun1();

    A<int> aa;//这样int型的就不行了
    aa.fun1();

    return 0;
}
 

泛化版类模板作为另一个类模板的友元

template<typename TT> class A;

template<typename T>
class Base{
private:
	T _id;   
    template<typename TT> friend class A ;
};

template<typename TT>
class A{
public:
    void fun1(){

        Base<int>base;
        base._id=2.50;
        cout<<base._id<<endl;
    }
    
};

int main()
{
    //都能调了
    A <double>a;
    a.fun1();

    A<int> aa;
    aa.fun1();

    return 0;
}
 

 类类型参数做类模板的友元 

template<typename T>
class Base {    
private:
    //T _id;
    void Print() {
        cout << "this is Base" << endl;
    }
    friend T;
};

class A {   
public:
    //  Base<A>base;//放成成员对象或者函数里都可以
    void fun1() { 
        Base<A>base;
        cout <<"this is A" << endl;
        //base._id=10;//看编译器了,因为相当于A类型转成int,发生隐式转换
        //有的编译器不行就要重载=
        base.Print();
    }
};
int main()
{
    A a;
    a.fun1();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BearPot

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值