模板学习笔记

/*

模板和内联是一样的,都必须放在头文件中。

内联需要在调用的地方进行内联展开,也必须看到定义。

因为模板需要在调用的地方进行实例化产生对应的模板函数的代码,不调用则不编译
如果在实例化的过程中找不到定义只能看到申明的话,只生成模板函数实例化的声明
无法完成定义的实例化

解决方法::使用模板的显示实例化,指定需要实例化的模板函数指定类型,但是麻烦

静多态:函数重载,模板实例化。在编译的时候确定调用的函数重载的版本和函数实例化的版本
#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;
}

-858993460
linux下不进行栈帧的初始化,无效值。


typename的两层含义
1、声明模板类型
2、声明后面的是一种类型

*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值