C++11模板友元语法

时间:2022-09-06 10:27:18

第 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 <typename> class B;

class A
{
friend class B<int>;
public:
void f()
{ cout << "class A"; } private:
int a;
}; template <typename T>
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 <typename T> friend class B;
public:
void f()
{ cout << "class A"; } private:
int a;
}; template <typename T>
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 <typename>class B;

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

第 5 类:

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

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

template <typename> class B;

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

第 6 类:

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

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

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

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

C++11模板友元语法的更多相关文章

  1. 模板类的约束模板友元函数:template friend functions

    本来这篇博客是不打算写的,内容不是很难,对于我自己来讲,更多的是为了突出细节. 所谓template friend functions,就是使友元函数本身成为模板.基本步骤:1,在类定义的前面声明每个 ...

  2. &lbrack;转载&rsqb;ECMall模板解析语法与机制

    ECMall模板解析语法与机制 2011-05-22 在ECMall模板中,用"{"开头,以"}"结尾就构成一个标签单元,"{"紧接着的单词 ...

  3. YAML 模板文件语法

    YAML 模板文件语法 默认的模板文件是 docker-compose.yml,其中定义的每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)来自动构建. 其 ...

  4. &lbrack;转&rsqb;Markdown 11种基本语法

    Markdown 11种基本语法 现在是我在学习Markdown时做的笔记.学完这些Markdown的基本使用已经不成问题. 1. 标题设置(让字体变大,和word的标题意思一样) 在Markdown ...

  5. ThinkPHP第五天&lpar;提交类型判定常量IS&lowbar;POST等,错误页面种类,Model实例化方式,模板中使用函数,foreach循环,模板中&period;语法配置&rpar;

    1.IS_GET.IS_POST.IS_PUT.IS_DELETE.IS_AJAX常量,方便快捷实现各个判断. 在Action类中还可以使用$this->isPost()等进行判断. 2.错误页 ...

  6. Markdown 11 种基础语法

    现在是我在学习Markdown时做的笔记.学完这些Markdown的基本使用已经不成问题. 1. 标题设置(让字体变大,和word的标题意思一样)在Markdown当中设置标题,有两种方式: 第一种: ...

  7. discuz模板引擎语法

    论坛的首页模板:forum/discuz.htm 版块的内容模板:forum/forumdisplay.htm 主题的查看模板:forum/viewthread.htm 帖子的内容模板:forum/p ...

  8. c&plus;&plus;11 模板的别名

    c++11 模板的别名 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #inclu ...

  9. C&plus;&plus;:模板友元

    模板友元函数在类内声明类外定义时都必须加模板前缀,另外模板要写在一个文件内 // generates undefined error for the operator<< function ...

随机推荐

  1. Bomb

    Description The counter-terrorists found a time bomb in the dust. But this time the terrorists impro ...

  2. spring mvc表单自动装入实体对象

    <form action="/springmvc1/user/add" method="post"> id: <input type=&quo ...

  3. poj 1026&lpar;置换群&rpar;

    题意:给你一个变换规则,和一个字符串,问经过k次变换后得到的字符串. 思路:开始的时候试图去找它的整个周期,谁知道周期太大了,各种RE,后来在得知此题需要用置换群来优化,第一次接触置换群学习了下! 代 ...

  4. POJ 1987 BZOJ 3365 Distance Statistics 树的分治&lpar;点分治&rpar;

    题目大意:(同poj1741,刷一赠一系列) CODE: #include <cstdio> #include <cstring> #include <iostream& ...

  5. tabbedApliction

    一.手动创建UITabBarController 最常见的创建UITabBarController的地方就是在application delegate中的 applicationDidFinishLa ...

  6. Codeforces Round &num;311 &lpar;Div&period; 2&rpar;

    我仅仅想说还好我没有放弃,还好我坚持下来了. 最终变成蓝名了,或许这对非常多人来说并不算什么.可是对于一个打了这么多场才好不easy加分的人来说,我真的有点激动. 心脏的难受或许有点是由于晚上做题时太 ...

  7. POJ 2255 Tree Recovery 二叉树恢复

    一道和Leetcode的一道题目基本上一样的题目. 给出前序遍历和中序遍历序列,要求依据这些信息恢复一颗二叉树的原貌,然后按后序遍历序列输出. Leetcode上有给出后序和中序,恢复二叉树的. 只是 ...

  8. FullCalendar 日历插件中文说明文档

    FullCalendar提供了丰富的属性设置和方法调用,开发者可以根据FullCalendar提供的API快速完成一个日历日程的开发,本文将FullCalendar的常用属性和方法.回调函数等整理成中 ...

  9. UIScrollView实现图片轮播器的无限滚动

    简介 在现在的一些App中常常见到图片轮播器,一般用于展示广告.新闻等数据,在iOS内并没有现成的控件直接实现这种功能,但是通过UIScrollView的允许分页设置,可以实现滚动轮播的功能. 轮播原 ...

  10. 一个redis因为关闭快照无法连接的BUG

    [2018-04-19 11:00:08,587: ERROR/MainProcess] consumer: Cannot connect to redis://127.0.0.1:6379/0: M ...