C/C++知识点:将模板申明为友元
小标 2018-06-15 来源 : 阅读 963 评论 0

摘要:本文主要向大家介绍了C/C++知识点的将模板申明为友元,通过具体的代码向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点的将模板申明为友元,通过具体的代码向大家展示,希望对大家学习C/C++知识点有所帮助。

代码编译运行环境:VS2012+Debug+Win32

严格来说,函数模板(类模板)是不能作为一个类的友元的,就像类模板之间不能发生继承关系一样。只有当函数模板(或类模板)被实例化之后生成模板函数(或模板类),该函数(或类)才能作为其他的类的友元。为了叙述的方便,我们也称一个函数模板(或类模板)是一个类或类模板的友元,其实真正的含义是函数模板(或类模板)被实例化后生成的模板函数(模板类)作为类(或模板类)的友元。

1. 把函数模板声明为类模板的友元

将函数模板申明为类模板的友元有三种方式。

1.1在类模板内部声明友元的函数模板

考察如下代码:

#include <iostream>using namespace std;
template<typename T>class A{
    T num;public:
    A(){
        num=T(5.5);
    }
    template<typename T> friend void show(const A<T>&a);
};
template<typename T> void show(const A<T>&a){
    cout<<a.num<<endl;
}
int main(){
    A<int> a;
    show<int>(a);
}

程序正确运行并输出5。

1.2在类模板内部对显示模板参数的函数模板进行友元申明

这种方法需要前置申明函数模板,考察如下程序。

#include <iostream>using namespace std;template<typename T>class A;template<typename T>void show(const A<T>&a);
template<typename T>class A{
    T num;public:
    A(){
        num=T(5.5);
    }
    friend void show<T>(const A<T>&a);
};
template<typename T> void show(const A<T>&a){
    cout<<a.num<<endl;
}
int main(){
    A<int> a;
    show<int>(a);
}

程序正确运行并输出5。

1.3在模板类内部直接声明并定义友元函数

这种情况只能在模板类内部一起把函数的定义写出来,不能在外部实现,因为外部需要类型参数,而需要类型参数就是模板了。其实这种情况相当于一般的模板类的成员函数,也相当于一个函数模板。考察如下代码。

#include <iostream>using namespace std;
template<typename T>class A{
    T num;public:
    A(){
        num=T(5.5);
    }
    friend void show(const A<T>&a){
        cout<<a.num<<endl;
    }
};
int main(){
    A<int> a;
    show(a);
    getchar();
}

程序正常编译运行并输出5。当然,将友元函数的定义改为:

template<typename T> void show(const A<T>&a){
    cout<<a.num<<endl;
}

也是完全可以的,如果将函数模板放在类模板外定义的话,和第一种方式相同。由于无论是江友元函数申明为一个使用了模板类的普通函数,还是一个函数模板,由于将友元函数直接定义在类模板体内,所以不会出现申明和定义见的不一致型。

 

2.把类模板声明为类模板的友元

把类模板声明为类模板的友元可以有两种方式。

2.1在类模板内部对模板类进行友元申明

这里要注意是对实例化后的模板类将其申明为类模板的友元,而不是类模板。因此实例化类模板时,类模板需要前置申明。考察如下程序。

#include <iostream>using namespace std;
template<typename T>class B; //类模板前置申明
template<typename T>class A{
    T num;public:
    A(){
        num=T(5.5);
    }
    friend class B<T>;
};
template<typename T>class B{public:
    static void show(const A<T>& a){
        cout<<"a.num:"<<a.num<<endl;    
    }
};
int main(){
    A<int> a;
    B<int>::show(a);
}

程序正常编译运行并输出:a.num:5。

2.2在类模板内部对类模板进行友元申明

这里要注意是直接将类模板申明为类模板的友元,而不是实例化后的模板咧,要与上面区别对待。这里就不需要将类模板B提前申明了,在类模板A中将B申明为:

template< class T>friend class B;

同样可以将类模板B申明为类模板A的友元。

不过,这两种方式在概念上还是有一些差异。第一种方式,类模板B的实例化依赖于类模板A的参数T。也就是说,对于一个特定的模板类A< t>来说,只有一个B的实例B< t>是它的友元类。而在第二中方式中,对于一个特定的类模板A< t>来说,B的任何实例B< u>都是它的友元类。

本文由职坐标整理并发布,了解更多内容,请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程