C ++。函数指针到模板函数会产生未解决的重载函数类型错误

时间:2014-04-29 16:19:37

标签: c++ templates

我需要创建一个类方法,将模板函数作为指向函数参数的指针,然后调用它。

但我遇到了

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"));
   }
    /* ...... */
};

1 个答案:

答案 0 :(得分:1)

当您将指针传递到'trampoline function'ThreadT<T>::start()方法时,您没有使用模板化函数实例化,您需要指定{{1}它应该被实例化:

T