/*
模板和内联是一样的,都必须放在头文件中。
内联需要在调用的地方进行内联展开,也必须看到定义。
因为模板需要在调用的地方进行实例化产生对应的模板函数的代码,不调用则不编译
如果在实例化的过程中找不到定义只能看到申明的话,只生成模板函数实例化的声明
无法完成定义的实例化
解决方法::使用模板的显示实例化,指定需要实例化的模板函数指定类型,但是麻烦
静多态:函数重载,模板实例化。在编译的时候确定调用的函数重载的版本和函数实例化的版本
#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、声明后面的是一种类型
*/