1. 定义

如果一个类模板包含一个非模板友元,则友元被授权可以访问所有模板实例。如果友元自身是模板,类可以授权给所有友元模板实例,也可以只授权给特定实例。

1.1 一对一友好关系

类模板与另一个(类或函数)模板间友好关系的最常见的形式是建立对应实例及其友元间的友好关系。

eg. Blob类应该将BlobPtr类和一个模板版本的Blob相

//前置声明,在Blob中声明友元所需要的
template <typename> class BlobPtr;
template <typename> class Blob; // 运算符==中的参数所需要的
template <typename T> bool operator== (const Blob<T>&,const Blob<T>&) ;template <typename T> class Blob {//每个Blob实例将访问权限授予用相同类型实例化的BlobPtr和相friend class B1obPtr<T> ;friend bool operator==<T> (const Blob<T>&, const Blob<T>&) ;// 其他成员定义, 与12.1.1 (第405页)相同
};

友元的声明用Blob的模板形参作为它们自己的模板实参。因此,友好关系被限定在用相同类型实例化的Blob与BlobPtr相等运算符之间

Blob<char> ca; // BlobPtr<char> 和operator==<char>都是本对象的友元
Blob<int> ia;// BlobPtr<int>和operator==<int>都是本对象的友元

1.2 通用和特定的模板友好关系

一个类也可以将另一个模板的每个实例都声明为自己的友元,或者限定特定的实例为友元:

//前置声明,在将模板的一个特定实例声明为友元时要用到
template <typename T> class Pal;
class C { // C是一个普通的非模板类friend class Pal<C>; //用类C实例化的Pal是C的一个友元// Pal2的所有实例都是C的友元;这种情况无须前置声明template <typename T> friend class Pal2;
};
template <typename T> class C2 { // C2 本身是一个类模板// C2的每个实例将相同实例化的Pal声明为友元friend class Pal<T>; // Pal 的模板声明必须在作用域之内// Pal2的所有实例都是C2的每个实例的友元,不需要前置声明template <typename X> friend class Pal2;// Pal3是一个非模板类,它是C2所有实例的友元friend class Pal3; //不需要Pal3的前置声明
.};

1.3 令模板自己的类型参数成为友元

可以将模板类型参数声明为友元.

eg. 将用来实例化Bar的类型声明为友元。

对于某个类型名Foo:

Foo将成为Bar<Foo>的友元
Sales_ data 将成为Bar<Sales data>的友元
template <typename Type> class Bar {friend Type; // 将访问权限授予用来实例化Bar的类型//...
};

注意:虽然友元通常来说应该是一一个类或是一一个函数, 但我们完全可以用一个内置类型来实例化Bar.这种与内置类型的友好关系是允许的,以便我们能用内置类型来实例化Bar这样的类。

C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板和友元相关推荐

  1. C++ Primer Plus 笔记(16章:string类和标准模板库)

    16 string类和标准模板库 16.1 string类 16.1.1 构造字符串 常见的字符串书中给了7个,另外还有两个在C++11里新增的(NTBS)表示以空字符结束的传统字符串 构造函数 描述 ...

  2. C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板成员函数的实例化

    1. 默认情况下,一个类模板的成员函数只有当程序用到它时才进行实例化. (即使某种类型不能完全符合模板操作的要求(参见9.2节,第294页),我们仍然能用该类型实例化类todo). eg. //实例化 ...

  3. C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板定义

    1. 定义 类似函数模板,类模板以关键字template开始,后跟模板参数列表.在类模板(及其成员)的定义中,我们将模板参数当作替身,代替使用模板时用户需要提供的类型或值: template < ...

  4. C++Primer Plus笔记——第十六章 string类和标准模板库总结及程序清单

    目录 本章小结 程序清单 string类 16.1 str1.cpp                16.2 strfile.cpp            16.3 hangman.cpp      ...

  5. C++模板与泛型编程:模板特例化

    文章目录 模板特例化 定义函数模板特例化 函数重载与模板特例化 类模板特例化 类模板部分特例化 特例化成员而不是类 模板特例化 ​ 编写单一模板,使之对任何可能的模板实参都是最合适的,都能实例化,这并 ...

  6. C++函数模板和模板函数、类模板和模板类

    这期间有涉及到函数模板与模板函数,类模板与模板类的概念 (类似于类与类对象的区别) 注意:模板类的函数声明和实现必须都在头文件中完成,不能像普通类那样声明在.h文件中,实现在.cpp文件中. 1.函数 ...

  7. C++模板学习02(类模板)(类模板语法、类模板与函数模板的区别、类模板中的成员函数创建时机、类模板对象做函数参数、类模板与继承、类模板成员函数类外实现、类模板分文件编写、类模板与友元)

    C++引用详情(引用的基本语法,注意事项,做函数的参数以及引用的本质,常量引用) 函数高级C++(函数的默认参数,函数的占位参数,函数重载的基本语法以及注意事项) C++类和对象-封装(属性和行为作为 ...

  8. C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板部分特例化

    1. 类模板的部分特例化(partial specialization) 类模板的特例化不必为所有模板参数提供实参(可以只指定一部分而非所有模板参数, 或是参数的一部分而非全部特性).类模板的部分特例 ...

  9. C++ Primer 5th笔记(chap 16 模板和泛型编程)模板特例化

    1. 场景 //第一个版本:可以比较任意两个类型 template <typename T> int compare (const T &, const T & );//第 ...

  10. C++ Primer 5th笔记(chap 16 模板和泛型编程)转发

    1. 转发 某些函数需要将其一个或多个实参连同类型不变地转发给其他函数. 因此需要保持被转发实参的所有性质, 包括实参类型是否是 const 的以及实参是左值还是右值. //接受一个可调用对象和另外两 ...

最新文章

  1. 恶犬秒变萌汪:东京大学开源“治愈系”GAN图片拼贴工具 | 技术头条
  2. 在交换机上,广播帧是如何发送的,
  3. 带实证明,imshow是能显示数据归一化到0到1的图像的!
  4. c 后台输出easyui html,EasyUI——实现展示后台数据代码
  5. [算法总结] 二分查找
  6. easy-ui的datagrid
  7. 在AWS第1部分中使用Terraform自动缩放组:基本步骤
  8. 如何将网站升级为HTTPS协议(整理)
  9. Python中sys模块
  10. 计算机网络教室后黑板报,教室后黑板报设计图
  11. 第九周项目三:星星图案(一)
  12. 微信公众平台 微接口 接口100 API100 接口大全
  13. 【Java面试题】常规Java面试题分享
  14. 区块链+游戏资产所有权,将如何激活游戏经济的发展?
  15. 记忆存储程序使得计算机能够实现,2016年职称计算机考试模块综合试题及答案(4)...
  16. cifar10数据集训练
  17. Python实现美国费城Danny`s Wok中餐馆菜单分析
  18. 网络中下层对上层提供的服务
  19. Graphcore发布IPU-M2000性能测试,训练和推理性能超英伟达!
  20. Vue-Vant—打包apk

热门文章

  1. Linux下一些实用的操作记录
  2. 【Scratch】青少年蓝桥杯_每日一题_5.07_猜数字
  3. 【Python】青少年蓝桥杯_每日一题_10.03_输出数据
  4. hibernate 向数据库里设置了默认值的字段添加数据为null时失效的问题
  5. php执行只读文件,php实现以只读方式打开文件的方法
  6. 机房环境监控系统基础知识
  7. UPS不间断电源放电时间计算方法
  8. 风口再起:数据中心建设
  9. 0基础linux运维,Linux运维基础
  10. ckeditor5加字数_CKEditor5基本使用