1. 函数模板
普通函数
void Swap(int &, int &);
模板函数
template <typename T>
void Swap(T &, T &);
显示具体化,下面两个等价
template<> void Swap<int>(int &, int &);
template<> void Swap(int &, int &);
注意:具体化将覆盖模板函数,普通函数将覆盖具体化和模板函数。
显式实例化函数
template void Swap<int>(int &, int &);
注意:在同一编程单元中使用同一种类型的显式实例和显示具体化将出错。
2.类模板
多参数类型
template <typename T1, typename T2>
class Pair
{
private:
T1 a;
T2 b;
};
默认类型模板参数
template <typename T1, typename T2 = int>
class Topo
{};
类模板类型参数提供默认值,但不能为函数模板参数提供默认值。
模板具体化
1.隐式实例化
A<int> *temp; 不会生成类的隐式实例化
temp = new A<int>; 生成类的定义
2.显式实例化
声明必须位于模板定义所在的名称空间中,
template class A<string, 100>;
3.显式具体化
通用的模板
template <typename T>
class SortedArray
{};
具体化
template <> class SortedArray<char *>
{};
4.部分具体化
普通模板
template <typename T1, typename T2>
class Topo
{};
部分具体化
template <typename T1> class Topo<T1, int> {};
3.模板类和友员
非模板友员
template <typename T>
class hasFriend
{
friend void counts();
friend void report(HasFriend<T>&);
}
模板类的约束模板友元函数
template <typename T> void counts();
template <typename T> void report(T &);
template <typename TT>
class hasFriend
{
friend void counts<TT>();
friend void report<>(HasFriend<TT>&);
}
模板类的非约束模板友元函数
template <typename T>
class ManyFriend
{
template <typename C, typename D> friend void show2(C &, D &);
};