博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++11模板友元语法
阅读量:5329 次
发布时间:2019-06-14

本文共 2546 字,大约阅读时间需要 8 分钟。

 

第 1 类:

普通类A的 普通类B 友元(一对一友好关系):

无需前置声明class B,当class B第一次出现在friend声明中时,该名字被隐式地认为可见。

class A{    friend class B;public:    void f()    { cout << "class A"; }private:    int a;};class B{public:    void f()    { cout << "class B"; }    void accessA(A& a)    { cout << a.a; }};

 

 

第 2 类:

普通类A的 实例化了的模板类B 友元(一对一友好关系):

如果普通类A的友元是一个实例化了的特定模板,那么这个具体实例化了的类在被声明为友元时,正如使用vector一样,要带具体的类型参数,如vector<int>,所以是friend class B<int>,但是和前面一种声明相比,编译器在读取class B<int>觉得很怪异,不知道这个<int>是什么东西,因此会报错,为了让编译器认识它,知道它是个实例化了的模板,必须在class声明之前先提前告知编译器class B原本是个模板,friend声明友元时表明了这是某一个具体模板实例。

template 
class B;class A{ friend class B
;public: void f() { cout << "class A"; }private: int a;};template
class B{public: void f() { cout << "class B"; } void accessA(A& a) { cout << a.a; }};

 

 

第 3 类:

普通类A的 模板类B 友元(一对多友好关系):

这里普通类class A的友元是模板class B,而不是某一个具体实例化了的class B<>,只要是这个模板实例化出来的B都是A的友元。

class A{    template 
friend class B;public: void f() { cout << "class A"; }private: int a;};template
class B{public: void f() { cout << "class B"; } void accessA(A& a) { cout << a.a; }};

 

 

第 4 类:

实例化模板类A的 实例化模板类B 友元(一对一友好关系):

同第2类相似,这里模板类A的友元类B也是一个模板,为了让编译器认识,必须得提前声明其是模板。且class A和class B使用相同模板类型参数,因此他们在使用相同类型实例化后得到的实例类是对应类型的一对一友好关系。

template 
class B;template
class A{ friend class B
;public: void f() { cout << "class A"; }private: T a;};template
class B{public: void f() { cout << "class B"; } void accessA(A
& a) { cout << a.a; }};

 

 

第 5 类:

模板类A的 实例化模板类B 友元(多对一友好关系):

同第2类相似,这里模板类A的友元类B也是一个模板,为了让编译器认识,必须得提前声明其是模板。B是一个特定的实例化了的模板类,它是任意模板A实例化后的友元。

template 
class B;template
class A{ friend class B
;public: void f() { cout << "class A"; }private: T a;};template
class B{public: void f() { cout << "class B"; } void accessA(A
& a) { cout << a.a; }};

 

 

第 6 类:

任意实例化模板类A的 模板类B 友元(多对多友好关系):

任意一个实例化的A对任意实例化的B都是友好关系。

template 
class A{ template
friend class B;public: void f() { cout << "class A"; }private: T a;};template
class B{public: void f() { cout << "class B"; } void accessA(A
& a) { cout << a.a; }};

 

 存在模板类A的某一特定实例化对模板类B的任意实例化都是友好关系的说明吗?回答是不存在。因为实例化A时,A必然已经定义过了,对于一个定义过了的模板,再去添加模板的友元,这是个悖论。

转载于:https://www.cnblogs.com/pluse/p/9294419.html

你可能感兴趣的文章
Web服务器的原理
查看>>
小强升职计读书笔记
查看>>
常用的107条Javascript
查看>>
#10015 灯泡(无向图连通性+二分)
查看>>
elasticsearch 集群
查看>>
忘记root密码,怎么办
查看>>
linux设备驱动归纳总结(三):1.字符型设备之设备申请【转】
查看>>
《黑客与画家》 读书笔记
查看>>
bzoj4407: 于神之怒加强版
查看>>
mysql统计一张表中条目个数的方法
查看>>
ArcGIS多面体(multipatch)解析——引
查看>>
JS 在火狐浏览器下关闭弹窗
查看>>
css3渐变画斜线 demo
查看>>
JS性能DOM优化
查看>>
设计模式 单例模式 使用模板及智能指针
查看>>
c#的const可以用于引用类型吗
查看>>
手动实现二值化
查看>>
What Linux bind mounts are really doing
查看>>
linux top命令详解
查看>>
博弈论小结
查看>>