Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为线程创建模板_C++_Templates_Std_Std Function - Fatal编程技术网

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:将使这成为一个更好的解决方案。