类模板中的友元声明


有三种友元声明可以出现在类模板中:

1 非模板友元类或友元函数

函数 foo() 成员函数bar()以及 foobar类都是类模板QueueItem的所有实例的友元

class Foo {
void bar();
};

template <class T>
class QueueItem {
friend class foobar;
friend void foo();
friend void Foo::bar();
// ...
};

2 绑定的 bound 友元类模板或函数模板:

在类模板 QueueItem的实例和它的友元也是模板实例之间定义了一对一的映射,对 QueueItem的每一个类型的实例,foobar foo()和 Queue<T>::bar()的单个相关的实例都是友元

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();

// ...

};

friend void foo<Type>( QueueItem<Type> );

函数名后面紧跟着显式的模板实参表 foo<type> 这种语法可用来指定该友元声明所引用的函数模板 foo()的实例。

如果省略了显式的模板实参 如下所示:

friend void foo( QueueItem<Type> );
则友元声明会被解释为引用了一个非模板函数,且该函数的参数类型是类模板 QueueItem的一个实例。

3 非绑定的 unbound 友元类模板或函数模板

在类模板QueueItem的实例和其友元之间定义了一对多的映射,

对 QueueItem的每一个类型的实例 foobar foo()和 Queue<T>::bar()的所有实例都是友元,如下所示:

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、WebLogic Server 性能调优
2、squid+iptables实现网关防火墙
3、webpack-vue.js环境
4、获得所有系统账号
5、智能算法-遗传算法


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号