C++ STL一一认识模板Template

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值