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! 可导出的模板
    //并不是所有的编译器都支持分离模式