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

C++模板类的使用的更多相关文章

  1. 单链表的C++实现(采用模板类)

    采用模板类实现的好处是,不用拘泥于特定的数据类型.就像活字印刷术,制定好模板,就可以批量印刷,比手抄要强多少倍! 此处不具体介绍泛型编程,还是着重叙述链表的定义和相关操作.  链表结构定义 定义单链表 ...

  2. 模板类 error LNK2019: 无法解析的外部符号

    如果将类模板的声明和实现写在两个独立的文件中,在构建时会出现"error LNK2019: 无法解析的外部符号 "的错误. 解决方法有: 第一种方法,就是把类模板中成员函数的声明和 ...

  3. 关于g++编译模板类的问题

    今天搞了我接近4个小时,代码没错,就是调试没有通过,无论怎么也没有想到是编译器的问题 g++不支持c++模板类 声明与实现分离,都要写到.h文件里面. 以后记住了.

  4. C++11特性(模板类 initializer_list)

    [1]initializer_list模板类 C++primer 原文如下: 通读原文相关篇幅,分析解读内容如下: 提供initializer_list类的初衷,为了便于将有限个同一类型(或可转换为同 ...

  5. C++11模板类使用心得

    1.推荐使用std::shared_ptr<TaskT>代替指针TaskT*使用,shared_ptr是一种智能指针,能自主销毁释放内存,在c++11中被引入,在多线程编程中有很大的用处, ...

  6. c++模板类

    c++模板类 理解编译器的编译模板过程 如何组织编写模板程序 前言常遇到询问使用模板到底是否容易的问题,我的回答是:“模板的使用是容易的,但组织编写却不容易”.看看我们几乎每天都能遇到的模板类吧,如S ...

  7. C++ 模板函数与模板类

    一.模板函数 函数模板提供了一类函数的抽象,即代表了一类函数.当函数模板被实例化后,它会生成具体的模板函数.例如下面便是一个函数模板:

  8. 模板类重载<<运算符

    写了一个Matrix模板类,需要重载<<, 1.需要友元函数 2.需要此函数的实现在.h中(本人试验出来的,放在.cpp中编译不通过) template <typename T> ...

  9. C++模板编程里的主版本模板类、全特化、偏特化(C++ Type Traits)

    1.  主版本模板类 首先我们来看一段初学者都能看懂,应用了模板的程序: 1 #include <iostream> 2 using namespace std; 3 4 template ...

随机推荐

  1. vs2012中VC连接mysql

    在MySQL的安装目录下你会找到include和lib文件夹(完全安装模式下),里面分别是C接口的头文件和库文件,库文件只用libmysql.lib就好了,即把libmysql.lib拷贝到了VC++ ...

  2. HTML基本知识

    HTML语言:超文本标记语言 基本结构: <html><head><body> <!DOCTYPE html PUBLIC "-//W3C//DTD ...

  3. MySQL操作汇总[转]

      这学期学习了数据库系统原理,做了实验,mark一记. 目录(没有一键目录不开心...) 1.T—SQL的简单查询.连接查询 (1)用SQL语句建库.建表并插入记录. (2)修改表结构,包括修改属性 ...

  4. INTERSECT交集运算

    INTERSECT交集是由既属于集合A,又属于集合B的所有元素组成的集合,如示意图1.

  5. 解决ajax中文乱码问题

    主要遇到的问题: 一.ajax向服务器提交的数据有中文,没有设置编码方式.造成服务器接收到乱码 二.服务器向ajax返回数据中有中文,没有设置响应编码方式,造成ajax接收到乱码 乱码产生的原因:不管 ...

  6. QB资料学习.01

    1.多数据集的读取 A.取数SQL的配置,借用TStringList进行存储多个不同的取数SQL B.DBA取数:  DBA.ReadMultipleDataSet(TStringList) C.结果 ...

  7. speechSynthesis

    /* $timeout.cancel(timer); */window.speechSynthesis.onvoiceschanged = function(e) { voices = speechS ...

  8. 一台服务器发布多个tomcat并注册服务名办法

    修改服务名称 打开Tomcat7.0.65_1/bin/service.bat  修改注册服务名称 当然这个名字自己改 比如Tomcat7_2 原始文件:   set SERVICE_NAME=Tom ...

  9. Sae上传war包找不到编译文件

    最近在试新浪的sae平台,有个问题困扰了几天,现在想来还是自己对JAVA的理解不深入,这里写下仅作记忆. 问题:在整微信公众号平台进开发者中心的时候,token验证一直是失败的.但是项目在本地的环境中 ...

  10. 转 纯CSS设置Checkbox复选框控件的样式

    Checkbox复选框是一个可能每一个网站都在使用的HTML元素,但大多数人并不给它们设置样式,所以在绝大多数网站它们看起来是一样的.为什么不把你的网站中的Checkbox设置一个与众不同的样式,甚至 ...