我正在尝试使用CTPL进行线程池化。作为测试,我试图让它在类中使用线程函数。使用下面的代码,我收到此错误:
error C2672: 'ctpl::thread_pool::push': no matching overloaded function found
error C2893: Failed to specialize function template 'std::future<unknown-type> ctpl::thread_pool::push(F &&)'
note: With the following template arguments:
note: 'F=void (__thiscall TestClass::* )(int)'
以下是代码:
class TestClass
{
public:
void testWorker(int id)
{
// do something
}
};
int main(int argc, char **argv)
{
ctpl::thread_pool p(2);
p.push(&TestClass::testWorker);
p.stop(true);
return 0;
}
这是被引用的CTPL的一部分:
template<typename F>
auto push(F && f) ->std::future<decltype(f(0))> {
auto pck = std::make_shared<std::packaged_task<decltype(f(0))(int)>>(std::forward<F>(f));
auto _f = new std::function<void(int id)>([pck](int id) {
(*pck)(id);
});
this->q.push(_f);
std::unique_lock<std::mutex> lock(this->mutex);
this->cv.notify_one();
return pck->get_future();
}
我很喜欢模板而且我很确定这是什么让我感到害怕。任何和所有帮助表示赞赏!
答案 0 :(得分:0)
这与模板无关(除了糟糕的错误信息)。 &TestClass::testWorker
是一个指向成员的函数。如果你有:
const auto tw = &TestClass::testWorker
您只能调用以下函数:
TestClass tc;
tc.*tw(0);
// or
TestClass* ptc = &tc;
ptc->tw(0);
如果您希望能够在没有类实例的情况下调用该函数来调用它,那么您需要使testWorker
静态:
class TestClass
{
public:
static void testWorker(int id)
{
// do something
}
};