为线程创建模板

时间:2015-04-20 13:47:36

标签: c++ templates std std-function

我想为Thread创建自己的模板类。作为模板参数,我想设置:线程启动时调用的函数,传递给先前定义的函数的参数类,线程结束后调用的函数和前一个函数返回的参数类。

所以我想要这样的事情:

在头文件中:

template<typename taskClass, typename taskDataClass, typename endCallbackClass, typename endCallbackDataClass>
class Thread {
public:
  Thread();

private:
  bool mIsActive;
  bool mIsDone;
  pthread_t mPThread;
  taskClass mTask;
  taskDataClass mTaskData;
  endCallbackClass mEndCallback;
  endCallbackDataClass mEndCallbackData;
}

在cpp文件中:

#include "Thread.h"

template<typename taskClass, typename taskDataClass, typename endCallbackClass, typename endCallbackDataClass>
Thread<taskClass, taskDataClass, endCallbackClass, endCallbackDataClass>::Thread() {

}

但是,创建此类的实例会导致麻烦:

auto th = new Thread<std::function<void(bool)>, bool, std::function<void(int)>, int>();

错误是:

undefined reference to `Thread<std::function<void (bool)>, bool, std::function<void (int)>, int>::Thread()' 

有人可以向我解释这种情况下的问题是什么吗?我没有看到问题...

2 个答案:

答案 0 :(得分:3)

您发布的代码有一个私有构造函数

template<typename taskClass, typename taskDataClass, typename endCallbackClass, typename endCallbackDataClass>
class Thread {
    Thread() {};
    ^^^^^^

但问题是链接错误:在你说的评论中

  

我在2个文件中有这个代码--cpp和h。我已经改变了一些代码而不是在这里添加两个文件。但是在cpp文件中,构造函数实现为空。

构造函数是否为空无关紧要:因为模板代码需要在编译时可用(即在翻译单元实际上看到之前),你需要:

  • 在头文件中提供您的实施代码
  • 明确地实例化您将要使用的类型的代码

推荐阅读:Why can templates only be implemented in the header file?

答案 1 :(得分:0)

template<typename taskClass, typename taskDataClass, typename endCallbackClass, typename endCallbackDataClass>
class Thread {
public:
    Thread() {};
private:
    bool mIsActive;
    bool mIsDone;
    int mPThread;  //use msvc 
    taskClass mTask;
    taskDataClass mTaskData;
    endCallbackClass mEndCallback;
    endCallbackDataClass mEndCallbackData;
};

int main()
{
    auto th = new Thread<std::function<void(bool)>, bool, std::function<void(int)>, int>();
}

作品! 你忘记了公共构造函数