类模板的友元
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;
}