1.关键字template总是放在模板的定义与声明的最前面, 后面是用逗号分隔的模板参数列表(template parameter list), 参数表不能为空
2.模板非类型参数是由一个普通的参数声明构成, 代表一个潜在的值:
template <typename Type, int size>
Type min(Type (&arr)[size]);
//当函数模板min()被实例化时, size的值会被一个编译时刻已知的常量值代替
3.类型和值的替换过程被称为模板的实例化(template instantiation)
4.c++支持两种模板编译模式:
包含模式(Inclusion Model)
分离模式(Separation Model)
包含编译模式下, 在每个模板被实例化的文件中包含函数模板的定义, 并且往往把定义放在头文件中, 向对内联函数左那样
--缺点: 函数模板体(body)描述了实现细节
分离编译模式下, 函数模板声明放在头文件中, 函数模板定义放在cpp文件里
//.h
template <typename Type> Type min(Type t1, Type t2);
//.cpp
export template <typename Type>
Type min(Type t1, Type t2) { /* ... */ }
//关键字 export! 可导出的模板
//并不是所有的编译器都支持分离模式