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 = 0,
        JOB_STATE_RUNNING = 1,
        JOB_STATE_SUCCESS = 2,
        JOB_STATE_FAIL = 3,
        JOB_STATE_CANCELLED = 4,
    } 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

原文地址:https://www.cnblogs.com/kuliuheng/p/5531898.html