C++ 为线程创建模板
我想为线程创建自己的模板类。作为模板参数,我想设置:线程启动时调用的函数、传递给先前定义的函数的参数类、线程结束后调用的函数以及前一个函数返回的参数类 所以我想要这样的东西: 在头文件中:C++ 为线程创建模板,c++,templates,std,std-function,C++,Templates,Std,Std Function,我想为线程创建自己的模板类。作为模板参数,我想设置:线程启动时调用的函数、传递给先前定义的函数的参数类、线程结束后调用的函数以及前一个函数返回的参数类 所以我想要这样的东西: 在头文件中: template<typename taskClass, typename taskDataClass, typename endCallbackClass, typename endCallbackDataClass> class Thread { public: Thread(); pr
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;
}
模板
类线程{
公众:
螺纹();
私人:
布尔误用;
布尔做错了;
pthread\u t mPThread;
任务类mTask;
taskDataClass mTaskData;
endCallback类和回调;
endCallbackDataClass和CallbackData;
}
在cpp文件中:
#include "Thread.h"
template<typename taskClass, typename taskDataClass, typename endCallbackClass, typename endCallbackDataClass>
Thread<taskClass, taskDataClass, endCallbackClass, endCallbackDataClass>::Thread() {
}
#包括“Thread.h”
模板
线程::线程(){
}
但是,创建此类类的实例会带来麻烦:
auto th = new Thread<std::function<void(bool)>, bool, std::function<void(int)>, int>();
auto th=新线程();
错误是:
undefined reference to `Thread<std::function<void (bool)>, bool, std::function<void (int)>, int>::Thread()'
对'Thread::Thread()'的未定义引用
谁能给我解释一下这个案子有什么问题吗?我看不出问题…模板
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>();
}
类线程{
公众:
线程(){};
私人:
布尔误用;
布尔做错了;
int-mPThread;//使用msvc
任务类mTask;
taskDataClass mTaskData;
endCallback类和回调;
endCallbackDataClass和CallbackData;
};
int main()
{
auto th=新线程();
}
工作!
您忘记了公共构造函数您发布的代码有一个私有构造函数
template<typename taskClass, typename taskDataClass, typename endCallbackClass, typename endCallbackDataClass>
class Thread {
Thread() {};
^^^^^^
模板
类线程{
线程(){};
^^^^^^
但问题是链接错误:在您的评论中指出
我在两个文件中有这段代码——cpp和h。我对代码做了一些修改,没有在这里同时添加这两个文件。但是在cpp中,文件构造函数的实现是空的 构造函数是否为空并不重要:因为模板代码需要在编译时可用(即在翻译单元实际看到彼此之前),所以您需要:
- 使您的实现代码在头文件中可用
- 显式地实例化要使用的类型的代码
推荐阅读:Private constructor(但我不理解这种情况下的错误)。代码在哪里?在头文件中?您的实现实际上在cpp文件中吗?您没有将构造函数的实际实现放在头文件之外的其他位置?我将此代码放在两个文件中-cpp和h。我对代码进行了一些更改,以不在此处添加这两个文件。但是在cpp文件中,构造函数实现是empty.虽然这是一个问题,但此解决方案与OP得到的错误不匹配(这是一个链接器错误),而且尽管他们可能想要一个公共构造函数,但他们可能不想要类的其余部分
public
。我认为在包含构造函数的行之后添加一个private:将使这成为一个更好的解决方案。