模板学习笔记

来源:互联网 发布:php saas平台架构设计 编辑:程序博客网 时间:2024/06/07 16:26
/*模板和内联是一样的,都必须放在头文件中。内联需要在调用的地方进行内联展开,也必须看到定义。因为模板需要在调用的地方进行实例化产生对应的模板函数的代码,不调用则不编译如果在实例化的过程中找不到定义只能看到申明的话,只生成模板函数实例化的声明无法完成定义的实例化解决方法::使用模板的显示实例化,指定需要实例化的模板函数指定类型,但是麻烦静多态:函数重载,模板实例化。在编译的时候确定调用的函数重载的版本和函数实例化的版本#define T char*  单纯字符替换,预编译 typedef char* T  独立类型,编译。是和int一样的类型不能用unsiged T这是两个类型模板的特殊实例化:模板的特例化针对特殊的类型参数1函数模板2模板的特例化3非模板函数    三者共存时,普通函数优先被调用隐式产生的对象都是常对象,成员对象的const 有两个含义1、保护实参,防止被修改2、用于隐式产生的临时常对象调用,否则无法编译1、类模板的选择性实例化,程序调用才实例化。2、友元函数无限定之分,访问其他类的私有成员。3、友元是单向的访问,不可以传递。友元在类中用template单独定义时,是一对多的友元关系,没有意义。类模板的非完全特例化,泛型指针模板1、template<typename T>class Link(T*)2、函数指针类型带两个形参的非完全特例化类型template<typename T typename E1 typename E2>class Link<T (*)(E1,E2) >3、函数类型的非完全特例化template<typename T>clasee Link<T()>函数类型和函数指针类的区别:函数类型定义出来的是函数名template<>//语法,提供特例化版本前提是有模板存在bool compare<const char*>(const char *a,const char *b){//模板不是简单的宏替换,是一种typedef的类型重命名的过程return strcmp(a,b) > 0;}-858993460linux下不进行栈帧的初始化,无效值。typename的两层含义1、声明模板类型2、声明后面的是一种类型*/

原创粉丝点击