C++模板类的使用
1、定义模板类
通过类似于下面的语法可以定义一个模板类:
template<typename T>
class Job : public virtual RefBase {
public:
class JobListener : public virtual RefBase {
public:
virtual void OnJobDone(sp< Job<T> >& job) {}
};
typedef enum {
JOB_STATE_IDLE = ,
JOB_STATE_RUNNING = ,
JOB_STATE_SUCCESS = ,
JOB_STATE_FAIL = ,
JOB_STATE_CANCELLED = ,
} job_status_t;
public:
//Job(string name, sp<T>& data);
Job(){}
Job(string name, sp<T>& data, sp<JobListener>& listener)
virtual ~Job(){} void set_job_listener(sp<JobListener>& listener) { job_listener_ = listener;}
};
template<typename T>
Job<T>::Job(string name, sp<T>& data, sp<JobListener>& listener):
name_(name),
data_(data),
job_listener_(listener),
run_next_when_fail_flag_(true),
state_(JOB_STATE_IDLE),
job_error_(NULL),
next_jobs_(2) {
}
2、定义模板成员函数
每个函数头都要以相同的模板声明打头,并将类限定符改成:类名<T>::这种形式。参见上面代码中的Job构造函数。
3、模板的使用方法
通过这样的代码可以实现一个特定类型的模板对象:
Job<JobController>* jcx = new Job<JobController>("", jct, jjl);
4、特别注意!
除非编译器实现了新的export关键字,否则将模板成员函数设置在一个独立的实现文件中将无法运行。因为模板不是函数,它们不能单独编译。模板必须与特定的模板实例化请求一起使用。为此,最简单的方法是将所有模板信息放在一个头文件里,并在要使用这些模板的文件中包含该头文件。如果编译器实现了心得export关键字,则可以将模板方法定义放在一个独立文件中,条件是每个模板声明都是以export开始:
#ifdef STACKTP_H_
#define STACKTP_H_ export template<class T>
class Stack
{
......
} #endif
然后按常规类的方式进行:
(1)将模板类声明(包括关键字export)放在一个头文件中,并使用#include编译指令时程序能够使用这些声明。
(2)将模板类的方法定义放在源代码文件中,在该文件中包含头文件,并使用工程文件时程序能够使用这些定义。
参考链接:http://blog.csdn.net/guoxiaoqian8028/article/details/7977202
最新文章
- Web Mercator Non-Conformal, Non-Mercator
- css-css权威指南学习笔记7
- 【积累篇:他山之石,把玉攻】Mime 类型列表
- GitHub学习心得之 安装配置与多帐号管理
- centos 网络配置
- Unity小知识
- lib和dll的区别,生成(转)
- DirectShow 最简单的入门 -- 播放一段视频
- Scriptcase优惠活动即将结束
- Cocos2d-JS使用CocosDenshion引擎
- 关于BigDecimal的四舍五入和截断 (2007-08-10 15:06:26)
- 【调侃】IOC前世今生 工厂模式 反射 依赖倒置
- WWDC-UIKit 中协议与值类型编程实战
- 安装 MySQL 后,需要调整的 10 个性能配置项
- Linux学习之CentOS(七)---常用基本操命令1
- unity 3D 学习笔记
- HTML5:图片、音乐和视频
- 乌龙之Ignoring query to other database问题
- 【王者荣耀之IT大神版】比赛制度说明(匹配赛、排位赛、赏金赛)
- jQueryMobile的按钮样式