类模板中的友元声明

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

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++之前的编译器不支持类模板中的这种友元声明

原文链接: https://www.cnblogs.com/lidan/archive/2011/08/04/2239489.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    类模板中的友元声明

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/29942

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 上午7:19
下一篇 2023年2月8日 上午7:19

相关推荐