我需要创建一个类方法,将模板函数作为指向函数参数的指针,然后调用它。
但我遇到了
ThreadPool.hh:55:2: error: no matching function for call to ‘ThreadPoolElem<int>::start(<unresolved overloaded function type>, ThreadPoolElem<int>*)’
我的代码的样本和说明是:
我有一个主模块ThreadPool,它有一个ThreadPoolElem向量。您可能已经猜到ThreadPoolElem是Threads的封装,ThreadPool扮演线程池管理器角色。从ThreadPool我需要迭代threadPoolElem向量。对于向量中的每个元素,我需要调用它的“开始”#39;成员函数,取2个参数(第一个是指向函数的指针)。在&#39;开始&#39; ThreadPoolElem类的成员函数它使用第一个参数作为第三个pthread_create c库函数的回调。
我的线程池文件像这样:
template <typename T>
class ThreadPool
{
Mutex _mutex;
CondVar _condVar;
SafeQueue<T> _tasks;
std::vector<ThreadPoolElem<T> > _threadVector;
/* .... */
void run(void)
{
for (typename std::vector<ThreadPoolElem<T> >::iterator it = this>_threadVector.begin();
it != this->_threadVector.end();
++it)
{
it->start(run_tramp, &(*it));
}
}
我的ThreadPoolElem文件是这样的:
template <typename T>
class ThreadPoolElem : public ThreadT<T>
{
SafeQueue<T> *_tasks;
CondVar *_condVar;
Mutex *_mutex;
public:
ThreadPoolElem(void) {}
void init(SafeQueue<T> *queue, CondVar *condVar, Mutex *mutex){
this->_mutex = mutex;
this->_condVar = condVar;
this->_tasks = queue;
}
void run(void){
while (true)
{
this->_mutex.lock();
if (this->_tasks.empty())
{
this->_condVar->wait();
this->_mutex->unlock();
}
else
{
int value;
this->_tasks->tryPop(&value);
std::cout << "consuming value" << std::endl;
if (!this->_tasks->empty())
{
this->_mutex->unlock();
this->_condVar->signal();
}
else
this->_mutex->unlock();
}
}
}
};
这是c函数(trampoline函数)我需要将ptr作为函数参数
template <typename T>
void *run_tramp(void *data)
{
reinterpret_cast<ThreadPoolElem<T> *>(data)->run();
return NULL;
}
最终相关文件是:
template <typename T>
class ThreadT
{
public:
typedef enum
{
NOT_YET_STARTED,
RUNNING,
DEAD,
}thread_status;
private:
thread_status status_;
pthread_t thread_;
public:
/* .... */
void start(void *(*ptr)(void *), void* data){
this->status_ = RUNNING;
if (pthread_create(&this->thread_, NULL, ptr, data) != 0)
throw (SystemError("pthread_create"));
}
/* ...... */
};
答案 0 :(得分:1)
当您将指针传递到'trampoline function'到ThreadT<T>::start()
方法时,您没有使用模板化函数实例化,您需要指定{{1}它应该被实例化:
T