根据《C++ Primer》第三版16.4节的叙述,C++类模板友元分为以下几种情况
1.非模板友元类或友元函数。 书上给了一个例子:
class Foo{
    void bar();
};
template <class T>
class QueueItem{
    friend class foobar;
    friend void foo();
    friend void Foo::bar();
    //....
};
很简单,跟非模板类没什么区别,有一点需要注意,如果要把函数和类生命为友元,前面不需要声明或定义。但是如果要把类成员函数声明为友元,则前面必须有类的定义(注意不是声明,是定义),因为一个类成员只能由该类的定义引入 。

2.绑定的友元类模板或函数模板。 例子如下:
template <class Type>
    class foobar{ ...};

template <class Type>
    void foo(QueueItem<Type>);

template <class Type>
class Queue{
    void bar();
    //...
};

template <class Type>
class QueueItem {
    friend class foobar<Type> ;
    friend void foo<Type> (QueueItem<Type>);
    friend void Queue<Type> ::bar();
    //...
};
需要注意两点:
    a.与非模板函数或类不同,模板函数或类声明为友元之前必须在前面声明过 ,否则无法通过编译。

b.注意红字部分,那几个Type不能少。比如对于函数foo,如果少了<Type>的话编译器会将其作为非模板函数对待,也就是说,对于QueueItem<int>,编译器会查找void
foo(QueueItem<int>),而对template<class T>void
foo(QueueItem<T>)视而不见,如果没找到非模板函数则会报错。

3.非绑定友元类模板或函数模板。 举例如下:
template <class Type>
class QueueItem {
    template<class T>
        friend class foobar;

template<class T>
        friend void foo(QueueItem<T>);

template<class T>
        friend void Queue<T>::bar();
    //...

};

C++模板类内友元(友元函数,友元类)声明的三种情况的更多相关文章

  1. python面向对象的多态-类相关内置函数-类内置魔法函数-迭代器协议-上下文管理-04

    多态 一种事物具备不同的形态 例如:水 --> 固态.液态.气态 多态:# 多个不同对象可以相应同一个对象,产生不同的结果 首先强调,多态不是一种特殊的语法,而是一种状态,特性(多个不同对象可以 ...

  2. 继承虚函数浅谈 c++ 类,继承类,有虚函数的类,虚拟继承的类的内存布局,使用vs2010打印布局结果。

    本文笔者在青岛逛街的时候突然想到的...最近就有想写几篇关于继承虚函数的笔记,所以回家到之后就奋笔疾书的写出来发布了 应用sizeof函数求类巨细这个问题在很多面试,口试题中很轻易考,而涉及到类的时候 ...

  3. java 多线程:Callable接口;FutureTask类实现对象【Thread、Runnable、Callable三种方式实现多线程的区别】

    Callable接口介绍: Java5开始,Java提供了Callable接口,像是Runnable接口的增强版,Callable接口提供了一个 call()方法可以作为线执行体. call()方法比 ...

  4. 配置B类内网 和 配置A类内网

    首先 A 类网 对应的 子网掩码是255.0.0.0 B 类网 对应的 子网掩码是255.255.0.0 C 类网 对应的 子网掩码是255.255.255.0 一般来说 10 开头的都是 A 类网  ...

  5. C++空类产生哪些成员函数 || C++类可以自动生成的6个成员函数

    class Empty {     public:     Empty(); // 缺省构造函数     Empty( const Empty& ); // 拷贝构造函数     ~Empty ...

  6. php函数,static,globalkeyword及三种变量作用域

    函数 和js函数相似,关注php与其它语言不用的地方 函数的形參默认值 形式: function f($a,$b=3,$vc = "abc"){ } 注意:没有给默认值的形參必须传 ...

  7. js函数声明的三种方式

    1.直接声明 function box(num1,num2){ return num1+num2;}alert(box(1,2)); 2.使用变量初始化 var box2 = function(num ...

  8. python网络编程调用recv函数完整接收数据的三种方法

    最近在使用python进行网络编程开发一个通用的tcpclient测试小工具.在使用socket进行网络编程中,如何判定对端发送一条报文是否接收完成,是进行socket网络开发必须要考虑的一个问题.这 ...

  9. 友元(友元函数、友元类和友元成员函数) C++

    有些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,这是很方便做到的.例如被重载的操作符,如输入或输出操作符,经常需要访问类的私有数据成员. 友元(frend)机制允许一个类将 ...

随机推荐

  1. HDU 4579 Random Walk (解方程组)

    Random Walk Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others)Total ...

  2. linux 清空catalina.out日志 不需要重启tomcat

    # cd /usr/local/tomcat8.0/logs/ # echo "" > catalina.out

  3. 常见dotNet加密保护工具分析介绍(转)

    本文主要介绍一些dotNet加密保护工具的原理以及就其脱壳进行简单探讨.remotesoft protector.maxtocode..Net Reactor.Cliprotector  .themi ...

  4. X11 FRAMEBUFFER QT

    之前对X11 FRAMEBUFFER理解的不够,现在总结一下Qt Embedded是挪威Trolletch公司的图形化界面开发工具Qt的嵌入式版本,它通过QtAPI与LinuxI/O以及Framebu ...

  5. SharePoint 2013 代码创建应用程序目录(App Catalog)

    众所周知,SharePoint App是2013版本的一大特色,那么,关于App的分发有几种方式呢?SharePoint给我们提供了两种方式,一种是上载到SharePoint应用商店,另一种是在本地S ...

  6. iOS:提示框(警告框)控件UIActionSheet的详解

    提示框(警告框)控件2:UIActionSheet 功能:当点击按钮或标签等时,弹出一个提示框,显示必要的提示,然后通过添加的按钮完成需要的功能.它与导航栏类似,它继承自UIView.   风格类型: ...

  7. 深入理解java虚拟机笔记之一

    Java的技术体系主要有支撑java程序运行的虚拟机,提供各开发领域接口支持Java API,java编程语言及许多第三方java框架( 如Spring,Structs等)构成. 可以把Java程序设 ...

  8. [CF 295A]Grag and Array[差分数列]

    题意: 有数列a[ ]; 操作op[ ] = { l, r, d }; 询问q[ ] = { x, y }; 操作表示对a的[ l, r ] 区间上每个数增加d; 询问表示执行[ x, y ]之间的o ...

  9. component is not authorized by this account hint: [B3GVCa0189e575] 错误解决?

    component is not authorized by this account hint: [aMADoA0312e514] component is not authorized by th ...

  10. 如何判断linux用户是否为root用户

    看命令行提示符 ,如果是#,那就是root用户,如下图:[root@localhost /]# 如果是$,那就是普通用户,如下图:[test@localhost ~]$