C++ STL一一认识模板Template

来源:互联网 发布:免费推广网络兼职平台 编辑:程序博客网 时间:2024/05/19 13:44

C++模板Template

通常有两种:函数模板、类模板

一、函数模板:针对仅参数类型不同的函数

函数模板格式:

template <class 形参名,class 形参名,......> 返回类型 函数名(参数列表){  函数体}
一般形式如下示例所示:

template <class T> void swap(T& a, T& b){}

二、类模板:针对仅数据类型和成员函数类型不同的类

template<class  形参名,class 形参名,…> class 类名{ ... };
形式示例如下:

template<class T> class A{     public:             T a;             T b;             T hy(T c, T &d);};


在类模板外部定义成员函数的方法:

template<模板形参列表> 函数返回类型 类名<模板形参名>::函数名(参数列表){函数体},

比如有两个模板形参T1T2的类A中含有一个void h()函数,则定义该函数的语法为:

template<class T1,class T2> void A<T1,T2>::h(){}

当在类外面定义类的成员时template后面的模板形参应与要定义的类的模板形参一致。

注意:模板的声明或定义只能在全局,命名空间或类范围内进行。即不能在局部范围,函数内进行,比如不能在main函数中声明或定义一个模板。

三、模板的形参:类型形参,非类型形参、模板形参

1.类型形参:由关键字class或typename后接说明符构成。

如:

template<class T> void h(T a){}
其中T就是一个类型形参。
用法注意:

针对函数模板,不能为同一个模板类型形参指定两种不同的类型,例如:

template<class T>void h(T a, T b){} //语句调用h(2, 3.2)将出错
针对类模板,当我们声明类对象为:
A<int> a,比如template<class T>T g(T a, T b){} //语句调用a.g(2, 3.2)在编译时不会出错,但会有警告
示例:

//TemplateDemo.h#ifndef   _TEMPLATE_DEMO_H_#define   _TEMPLATE_DEMO_H_template<class T> class A{public:T g(T a,T b);A();};#endif
//TemplateDemo.cpp#include<iostream>#include <string>#include "TemplateDemo.h"template<class T> A<T>::A(){}//template<模板形参列表> 函数返回类型 类名<模板形参名>::函数名(参数列表){函数体}template<class T> T A<T>::g(T a,T b){return a+b;}void main(){A<int> a;std::cout<<a.g(2,3.2)<<std::endl;}


2.非类型形参
由于涉及到的知识点比较多,详细说明可以参考如下作者链接,感谢原创者知识分享与总结
http://www.cnblogs.com/gw811/archive/2012/10/25/2738929.html
http://www.cnblogs.com/gw811/archive/2012/10/25/2736224.html