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! 可導出的模板
    //并不是所有的編譯器都支持分離模式