C++函数模板作为类模板的友元

//program 18.5.2.cpp函数模板作为类模板的友元
#include <iostream>
#include <string>
/*类模板Pair<T1,T2>*/
using namespace std;
template <class T1, class T2>
class Pair
{
private:
T1 key; //关键字
T2 value; //值
public:
/*constructor:*/
Pair(T1 k, T2 v) :key(k), value(v) { };
/*overload_operator_= */
bool operator < (const Pair<T1, T2>& p) const;
/*将重载的全局函数"<<"(流提取运算符)声明为友元;通过传入参数对象来调用该重载运算符:*/
template <class T3, class T4>
friend
ostream& operator<< (ostream& o, const Pair<T3, T4>& p);
};
/*重载"<"成员函数模板*/
template<class T1, class T2>
bool Pair<T1, T2>::operator < (const Pair<T1, T2>& p) const
{ //"小"的意思就是关键字小
return key < p.key;
}
/*重载流提取运算符"<<";*/
template <class T1, class T2>
ostream& operator<< (ostream& o, const Pair<T1, T2>& p)
{
/*将类模板Pair<T1,T2>实例化为Pair<int,double>模板函数;同时定义了一个该类型的成员对象obj(同时将其初始化为(12,3.14)*/
Pair<int, double> obj(12, 3.14);
/*由于该函数模板是类模板的友元函数模板,故可以访问到该成员对象的私有成员变量*/
//obj.key = 4; (合法)
/*指定重载后的输出格式:*/
o << "(" << p.key << "," << p.value << ")";
return o;//为了实现连续输出;
}
int main()
{
/*类模板Pair<T1,T2>的两种实例化举例*/
Pair<string, int> student("Tom", 29), student_2("jack", 30);/*T<j(大写字母<小写字母)*/
/*另一种实例化*/
Pair<int, double> obj(12, 3.14);
/*测试重载后的流提取运算符"<<"的效果:(可以作用域不同类的对象)*/
cout << student << endl << obj << endl;
/*重载之后的成员函数"<"的效果(只能够够作用域同类对象之间;即只能够比较同一个模板类下实例化下出对象)*/
cout << "输出键(key)最小的那个元组" << endl << (student < student_2 ? student : student_2) << endl;
return 0;
}
/*
将函数模板operator<<声明为Pair类模板的友元。
编译本程序时﹐编译器自动生成了两个operator<<函数,它们的原型分别如下
ostream & operator <<( ostream & o,const Pair<string,int> &p);
ostream & operator <<( ostream & o, const Pair<int, double> & p);
在Visual Studio中,这两行也可以用下面的写法替代:
friend ostream & operator <<T1,2>( ostream &o,const Pair<T1,12>& p);
但在 Dev C++中,替代后就编译不过了。
*/
posted @   xuchaoxin1375  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2021-05-24 三元二次方程式x2+y 2=z2的正整数解x、y、z称为一组勾股数,又称为毕达哥拉斯三元数组。该方程式也称为“商高方程”或“毕达哥拉斯方程”。 试通过程序设计求指定区间[a,b]内的所有勾股数组。
点击右上角即可分享
微信分享提示