类模板中的友元声明

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

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

当我们声明一个类模板时,有时候我们需要让某个类能够访问到这个模板类的私有成员或保护成员。这时我们就可以使用友元类来实现。 下面是一个声明类模板友元类的示例代码: ``` template<typename T> class MyTemplateClass { friend class MyFriendClass; public: MyTemplateClass(T value); private: T m_value; }; template<typename T> MyTemplateClass<T>::MyTemplateClass(T value) : m_value(value) {} class MyFriendClass { public: template<typename T> void printValue(const MyTemplateClass<T>& obj) { std::cout << "The value is: " << obj.m_value << std::endl; } }; int main() { MyTemplateClass<int> obj(42); MyFriendClass friendObj; friendObj.printValue(obj); return 0; } ``` 在这个示例代码,我们声明了一个类模板`MyTemplateClass`,并且声明了一个友元类`MyFriendClass`。通过`friend class MyFriendClass;`语句,我们将`MyFriendClass`声明为`MyTemplateClass`的友元类,这意味着`MyFriendClass`可以访问到`MyTemplateClass`的私有成员或保护成员。 在`MyFriendClass`,我们定义了一个模板函数`printValue`,该函数接受一个`MyTemplateClass`类型的对象作为参数,并打印出这个对象的私有成员`m_value`。在`main`函数,我们实例化了一个`MyTemplateClass`对象,并创建了一个`MyFriendClass`对象`friendObj`,然后通过`friendObj.printValue(obj)`调用了`MyFriendClass`的`printValue`函数,输出了`MyTemplateClass`对象的私有成员值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值