gpt4 book ai didi

c++ - 为线程创建模板

转载 作者:行者123 更新时间:2023-11-30 02:39:33 28 4
gpt4 key购买 nike

我想为 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()' 

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

最佳答案

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

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

但问题是链接错误:您在评论中指出

I have this code in 2 files - cpp and h. I've changed the code a bit not to add both files in here. However in cpp file constructor implementation is empty.

构造函数是否为空并不重要:因为模板代码需要在编译时可用(即在翻译单元实际看到彼此之前),您需要:

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

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

关于c++ - 为线程创建模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29749747/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com