我想为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()'
有人可以向我解释这种情况下的问题是什么吗?我没有看到问题...
答案 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>();
}
作品! 你忘记了公共构造函数