c/c
c 模板中定义友元 -凯发ag旗舰厅登录网址下载
在类模板中可以出现三种友元声明:
(1)普通非模板类或函数的友元声明,将友元关系授予明确指定的类或函数。
(2)类模板或函数模板的友元声明,授予对友元所有实例的访问权。
(3)只授予对类模板或函数模板的特定实例的访问权的友元声明。
要注意的是,友元函数并非成员函数,是改变了它对类成员的访问权限。
(1)没有什么好说的,如:
template
class a{
friend void fun();
//...
};
此例中fun可访问a任意类实例中的私有和保护成员
(2)
template
class a{
template
friend void fun(t u);
//...
};
这时友元使用与类不同的模板形参,t可以是任意合法标志符,友元函数可以访问a类的任何类实例的数据,即不论a的形参是int,double或其他都可以。
(3)
template
class a{
friend void fun
//...
};
此时fun只有访问类中特定实例的数据。换句话说,此时具有相同模板实参的fun函数与a类才是友元关系。即假如调用fun时其模板实参为int,则它只具有a
回到原问题,按(3)可改为:
template
friend std::ostream& operator <<
//……
};
按(2)可改为:
template
template
friend std::ostream& operator << (std::ostream& os,const list
//……
};
在这里其实两者实现的最终效果一样的,因为调用输出运算符时需要访问的类实例的对象是它本身,所以形参t在第一种改法中一定匹配。
对类建立友元函数很容易。但是迁移到模板上却容易出现让人摸不着头脑的连接错误。
层次不够,不做分析,单纯介绍两种为类模板定义友元函数的方法
1 封闭型
classmyclass
{
friend voidfunction( myclass<t >&arg )
{
}
}; 要点:友元函数定义在模板体内。
2 开放型
template<typename t >
classmyclass
{
template<typename c >
friend voidfunction( myclass<c >&arg );
};
template<typename c >
voidfunction( myclass<c >&arg )
{
} 要点:模板体内要另建模板。
3 告诉编译器声明的设个是模板
#include <iostream>
usingnamespacestd;
template <typename t >
classa
{
friend ostream &operator<< < t >( ostream &, consta<t >&);
};
template <typename t >
ostream &operator<<( ostream &output, consta<t >&a )
{
output <<"重载成功"<<endl;
returnoutput;
}
intmain()
{
a<int>a;
cout <<a;
}要点:显示地在重载的运算符或者函数后面加上模板声明< t >,告诉编译器友元函数是一个类型一致的模板。
(这个方法在vs2010没通过)
建议:
如果希望使用函数与模板特化的类型相对应,则使用方法3(模板显示声明)
如果希望使用函数与模板特化的类型相独立,则使用方法2(二重模板)
简短的内联函数使用方法1本文来自csdn博客,转载请标明出处:http://blog.csdn.net/squarereal/archive/2009/09/23/4579950.aspx
转载于:https://blog.51cto.com/7209253/1201974
总结
以上是凯发ag旗舰厅登录网址下载为你收集整理的c 模板中定义友元的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得凯发ag旗舰厅登录网址下载网站内容还不错,欢迎将凯发ag旗舰厅登录网址下载推荐给好友。
- 上一篇:
- 下一篇: