c/c++ 模板与STL小例子系列<二> 模板类与友元函数

比如某个类是个模板类D,有个需求是需要重载D的operator<<函数,这时就需要用到友元。

实现这样的友元需要3个必要步骤

1,在模板类D的实现代码的上面声明友元函数

template<typename> class D;//因为友元函数的参数里使用了D,所以要先在这里声明一下
template<typename T>
ostream& operator<< (ostream&, const D<T> &);

2,在模板类D的实现代码里面声明它是我的友元

//注意operator<<后面有<T>
friend ostream& operator<< <T>(ostream& ,const D<T>&);

3,实现友元函数

template<typename T>
//注意operator<<后面没有<T>
ostream& operator << (ostream& out,const D<T>& d){
out << d.x;
return out;
}

例子代码:

#include <iostream>
using namespace std; template<typename T>
class Test{
public:
Test(T t) : data(t){}
virtual void show() = 0;
private:
T data;
}; template<typename> class D;
template<typename T>
ostream& operator<< (ostream&, const D<T> &); template<typename T>
class D : public Test<T>{
//注意有<T>
friend ostream& operator<< <T>(ostream& ,const D<T>&);
public: //注意不是Test(t1)
D(T t1, T t2) : Test<T>(t1), x(t2){}
void show(){
cout << x << ", " << x << endl;
}
private:
T x;
}; template<typename T>
ostream& operator << (ostream& out,const D<T>& d){
out << d.x;
return out;
} int main(void){
Test<int> *p = new D<int>(10, 21);
p->show();
D<int> d(10,20);
cout << d << endl;
return 0;
}

模板类继承非模板类,非模板类继承模板类

下面的例子没有什么实际意义,只看语法。

#include <iostream>
using namespace std; class Foo{
public:
Foo(int a, int b, int c) : x(a), y(b), z(c){}
void show(){
cout << x << "," << y << "," << z << endl;
}
private:
int x, y, z;
}; template <typename T>
class Goo : public Foo{
public:
Goo(T t, int a, int b, int c):Foo(a,b,c), data(t){}
void show(){
cout << data << endl;
cout << "Goo show" << endl;
}
private:
T data;
}; class Hoo : public Goo<int>{
public:
Hoo(int a1,int a2,int a3,int a4,int a5):
Goo(a1,a2,a3,a4),ho(a5){}
void show(){
cout << "Hoo show" << endl;
}
private:
int ho;
};
int main(void){
Hoo hoo(1,2,3,4,5);
hoo.show();
Goo<string> goo("abc",1,2,3);
goo.show();
return 0;
}

c/c++ 模板与STL小例子系列<二> 模板类与友元函数的更多相关文章

  1. c/c++ 模板与STL小例子系列<三> traits

    c/c++ 模板与STL小例子系列 traits 对这个概念,还是处于懵逼的状态,初步体会就是,为了解决类型之间的转换问题. 从一个类型为A的指针,转化到类型为B的指针,中间需要用void*来作为中介 ...

  2. c/c++ 模板与STL小例子系列<一 >自建Array数组

    c/c++ 模板与STL小例子系列 自建Array数组 自建的Array数组,提供如下对外接口 方法 功能描述 Array() 无参数构造方法,构造元素个数为模板参数个的数组 Array(int le ...

  3. C++模板类中友元函数的写法

    首先,已声明好的类Triangle file://Triangle.h template<class T> class Triangle{ public: Triangle(T width ...

  4. python2.7练习小例子(二十九)

        29):1.题目:按相反的顺序输出列表的值. #!/usr/bin/python # -*- coding: UTF-8 -*- a = ['one', 'two', 'three'] for ...

  5. python2.7练习小例子(二十七)

        27):题目:一个5位数,判断它是不是回文数.即12321是回文数,个位与万位相同,十位与千位相同.      #!/usr/bin/python # -*- coding: UTF-8 -* ...

  6. python2.7练习小例子(二十八)

    28):题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母.     程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母. ...

  7. python2.7练习小例子(二十四)

        24):1.题目:利用递归方法求5!.     程序分析:递归公式:fn=fn_1*4! #!/usr/bin/python # -*- coding: UTF-8 -*- def fact( ...

  8. python2.7练习小例子(二十三)

        23):题目:求1+2!+3!+...+20!的和.     程序分析:此程序只是把累加变成了累乘. #!/usr/bin/python # -*- coding: UTF-8 -*- n = ...

  9. gcc的bug? c++模板类中友元函数的訪问权限问题

    原文地址:http://stackoverflow.com/q/23171337/3309790 在c++中,模板类中能够直接定义一个友元函数.该函数拥有訪问该模板类非public成员的权限. 比方: ...

随机推荐

  1. Linux常用命令之链接命令和权限管理命令

    目录 1.链接命令 一.生成链接文件命令:ln 2.权限管理命令3.总结 一.更改文件或目录权限命令:chmod 二.改变文件或目录所有者命令:chown 三.改变文件或目录所属组命令:chgrp 四 ...

  2. mysql常用字符串操作函数大全,以及实例

    今天在论坛中看到一个关于mysql的问题,问题如下 good_id     cat_id12654         665,56912655         601,4722 goods_id是商品i ...

  3. pytorch模型部署在MacOS或者IOS

    pytorch训练出.pth模型如何在MacOS上或者IOS部署,这是个问题. 然而我们有了onnx,同样我们也有了coreML. ONNX: onnx是一种针对机器学习设计的开放式文件格式,用来存储 ...

  4. Perl读取标准输入<STDIN>、读取文件输入<>和chomp函数

    读取标准输入<STDIN> <STDIN>表示从标准输入中读取内容,如果没有,则等待输入.<STDIN>读取到的结果中,如果没有意外,都会自带换行符. 例如,tes ...

  5. μC/OS-II 任务的同步与通信 --- 信号量

    任务间通信 系统中的多个任务在运行时,经常需要互相无冲突地访问同一个共享资源,或者需要互相支持和依赖,甚至有时还要互相加以必要的限制和制约,才保证任务的顺利运行.因此,操作系统必须具有对任务的运行进行 ...

  6. GitHub:我们是这样弃用jQuery的

    摘要: 技术债清理流程指南. 原文:Removing jQuery from GitHub.com frontend 译文:GitHub:我们为什么会弃用jQuery? 作者:GitHub 前端工程团 ...

  7. 填一个laravel视图缓存没有及时更新的坑

    1.此坑背景 laravel在渲染blade模板后,会将渲染好的结果存到storage/framework/views(默认路径,也可在配置中修改的)中,以便下次使用.但我最近总是发现修改了blade ...

  8. vue-cli创建的项目的目录结构及说明

    转自:http://blog.csdn.net/qq_34543438/article/details/72868546?locationNum=3&fps=1 一. ├── build    ...

  9. 学习之路-前端-笔记-一、HTML笔记

    各种技巧 1.在Webstrom中 同时按ctrl+alt+insert创建新内容 2.输入标签按tab自动补全 按end 或 HOME实现光标移动到当前行的最后或最前 3.按住alt键不放同时按鼠标 ...

  10. OSGI企业应用开发(十五)基于Spring、Mybatis、Spring MVC实现一个登录应用

    前面文章中,我们已经完成了OSGI应用中Spring.Mybatis.Spring MVC的整合,本篇文章我们就在这个基础上来完成一个简单的登录应用,其中用户名和密码需要从数据库中查询. 前面文章中, ...