模板分为类模板与函数模板
函数模版:为函数写一个模版,在使用函数时需要指出类型.Template <class(或typename) T> 返回值类型函数名(形参表){.... }
类模版:为类写一个模版,在使用类时需要指出类型.
Template <class(或typename) T> class 类名{.... }
类模版内函数类外实现:
在类模板外部定义成员函数,template<模板形参列表> 函数反回类型类名<模板形参名>::函数名(参数列表){函数体}template <class T,class N> void test<T,N>::print() { 函数体; }
#include <iostream> using namespace std; //普通函数模版 template <class T,class N> void fun(T a,N b) { cout<<"函数模版"<<endl; } //函数模版特化非类型形参 template <int a> void fun(int b,int c) { cout<<"非类型形参"<<endl; } //函数模版特化 template <> void fun(string a,int b) { cout<<"模版特化"<<endl; } int main() { fun<string,string>("sky","sky");//调用普通函数模版 fun<string,int>("sky",0);//调用模版特化 fun<5>(0,0);//调用非类型形参模版 return 0; }
#include <iostream> using namespace std; //普通模版类 template <class T,class N> class test { public: void print(); }; //函数类外实现 template <class T,class N> void test<T,N>::print() { cout<<"普通模版类"<<endl; } //模版特化,<>表示这是一个模板类,同时在类名后加上特化的类型 template <> class test<int,int> { public: void print() { cout<<"模版特化"<<endl; } }; //模版偏特化,在类名后加上特化的类型以及模板类型 template <class T> class test<T,int> { public: void print() { cout<<"模版偏特化"<<endl; } }; int main() { test<string,string> a; a.print(); test<int,int> b; b.print(); test<string,int> c; c.print(); return 0; }
注意:
1. 函数模版没有偏特化
2. 不能为同一个模板类型形参指定两种不同的类型3. 对于模板函数,如果类型参数可以推导,那么可以省略类型参数表
原文地址:http://blog.csdn.net/zsp_skyer/article/details/33775285