读书笔记--模板(2)
模板的编译模型:
应该将类定义和函数声明放在头文件中,而普通函数和类成员函数的定义放在源文件中。要进行模板的实例化,便一起必须能访问定义模板的源代码。
1、包含编译模型
//utlities.h
#ifndef UTLITIES_H
#define UTLITIES_H
template<class T> int compare(const T&,const T&);
#include "utilites.c"
#endif //end of utlities.h
//utlities.c
#include "utlities.h"
template<class T>int compare(const T&v1,const T&v2)
{
if( v1<v2 )
{
return -1;
}
if( v2<v1 )
{
return 1;
}
return 0;
}
//other definetions
这种策略使我们能够保证头文件和实现文件的分离,也保证了编译时使用模板代码能看到两种文件.
2、分别编译模型
可以使用export关键字让便一起知道要记住给定的模板定义。
export能够指明给定的定义可能会需要在其他文件中产生实例化,一个模板只能定义为导出一次,且不能在模板声明中出现export
export template<typename Type>
Type Sum(Type t1,Type t2)
如果头文件中的类定义体使用了export,则该头文件只能被程序中的一个源文件使用
//class template header goes in shared header file
template<class Type> class Queue{//...};
//Queue.c implementation file declared Queue as export
export template<class Type> class Queue;
#include "Queue.h"
导出类的成员将自动声明为导出,也可以将类模板的个别成员声明为导出的
非类型形参的模板实参:
template<int i,int wid>
class Screen
{
public:
Screen():Screen(hi*wid,'#'),cursor(0),height(hi),width(wid){}
private:
string screen;
string::size_type cursor;
string::size_type height,width;
};
该模板有两个非类型形参,使用Screen类型时序显示声明为Screen<24,80>
非类型模板实参必须是编译时常量表达式
类模板的友元声明:
template<class Type>class Bar
{
friend class FooBar;
friend void fun(); //非模板类或模板函数为类模板的友元
template<class T>friend class Foo1;
template<class T>friend void temp_fcn1(const T&);
//友元可以是类模板或函数模板
};
类也可以只授予对特定实例的访问权
template<class T>class Foo2;
template<class T>void temp_fcn2(const T&);
tempalte<class Type>class Bar;
{
friend class foo2<char *>;
friend class temp_fcn2<char *>(char *const &);
friend class Foo2<Type>;
friend class temp_fcn2<Type>(const Type &);
};
Foo2是类模板,由原关系只扩充到Foo2的形参类型为char *的特定实例。只有与给定Bar实例有相同模板实参的那些Foo2或temp_fcn版本是友元,因此Foo3<int>可以访问Bar<int>的私有部分,但不能访问Bar<string>或者任意其他Bar实例的私有部分
如果友元类是普通类(不是模板类)则可以不事先声明,反之就需要声明
template<class T>class A;
template<class T>
class B
{
public:
friend class A<T>; //ok,A is known to be a template
friend class C; //ok,C must be an ordinary nontempalte class
template <class S> friend class D; //ok,D is a template
friend class E<T>; //error,E wasn't declared as a template
};
读书笔记--模板(2)相关推荐
- 读书笔记--模板与泛型编程
了解隐式接口和编译期多态 编译期多态和运行期多态 运行期多态就好比是virtual函数再运行的时候才确定该virtual函数该被绑定为哪个函数,运行的时候才确定函数类型. 编译期多态就好比是泛型编程和 ...
- 读书笔记--模板(3)
成员模板: 成员模板不能为虚 template<class Type> class Queue { public: template<class It> Que ...
- 读书笔记--模板(1)
函数模板时独立于子类型的函数,可作为一种方式.产生函数的特定类型版本,使用函数模板时,编译器会推断那个模板实参,一旦编译器确定了实际的模板实参,就称它实例了函数模板的一个实例. inline 说明 ...
- 高效能沟《关键对话》读书笔记PPT模板-优页文档
模板介绍 高效能沟<关键对话>读书笔记PPT模板-优页文档.一套,教育培训,读书笔记,幻灯片模板,内含青色多种配色,风格设计,动态播放效果,精美实用. 希望下面这份精美的PPT模板能给你带 ...
- 《高效能人士的7个习惯》读书笔记PPT模板
模板介绍 <高效能人士的7个习惯>读书笔记PPT模板.一套读书笔记幻灯片模板,内含橙色多种配色,风格设计,动态播放效果,精美实用. 希望下面这份精美的PPT模板能给你带来帮助,温馨提示:本 ...
- 《照着做,你就是最能干的人》读书笔记PPT模板
模板介绍 <照着做,你就是最能干的人>读书笔记PPT模板.一套读书笔记幻灯片模板,内含蓝色多种配色,风格设计,动态播放效果,精美实用. 希望下面这份精美的PPT模板能给你带来帮助,温馨提示 ...
- 《罗辑思维》读书笔记PPT模板
模板介绍 <罗辑思维>读书笔记PPT模板.一套读书笔记幻灯片模板,内含橙色多种配色,风格设计,动态播放效果,精美实用. 希望下面这份精美的PPT模板能给你带来帮助,温馨提示:本资源使用PP ...
- 《高效学习7堂课》读书笔记PPT模板
模板介绍 <高效学习7堂课>读书笔记PPT模板.一套读书笔记幻灯片模板,内含红色多种配色,风格设计,动态播放效果,精美实用. 希望下面这份精美的PPT模板能给你带来帮助,温馨提示:本资源使 ...
- 《每天最重要的2小时》读书笔记PPT模板
模板介绍 <每天最重要的2小时>读书笔记PPT模板.一套读书笔记幻灯片模板,内含蓝色多种配色,风格设计,动态播放效果,精美实用. 希望下面这份精美的PPT模板能给你带来帮助,温馨提示:本资 ...
最新文章
- TensorFlow文本情感分析实现
- EL:固氮能力主要取决于物种分类而不是土壤养分
- 苏宁云仓投入使用,此时物流爆发是否来得及?
- 在 Inno Setup 中实现倒数N秒后激活按钮
- 转:数学之美番外篇:平凡而又神奇的贝叶斯方法 收藏
- 云炬随笔20180613
- 网站使用微信扫码登录流程
- Caused by: org.springframework.amqp.AmqpException: No method found for class [B
- retain、strong、weak、assign区别
- 深入浅出组合逻辑电路(3)常见的几种编码器
- Swift3 Scanner用法之判断是否数字、提取字符串里的数字
- spring 集成mybatis——多数据源切换(附带定时器的配置)
- vscode保存react时标签出现空格自动换行报错
- sublime快捷键设置
- python网站设计中接口的作用_python接口自动化(三)--如何设计接口测试用例(详解)...
- Openwrt netifd ubus解析
- 《天勤数据结构》笔记——使用两个栈实现共享栈实现(C/C++)
- c4d流体插件_C4D流体烟雾模拟插件TurbulenceFD C4D v1.0.1437中文版流体
- PHP微信小程序生成带参二维码getwxacodeunlimit
- 华为云文字识别服务关键技术、能力和产品落地需要注意的事宜(OCR系列二)