std :: thread ---没有匹配的构造函数

时间:2016-02-03 08:39:26

标签: c++ multithreading c++11

所以,我有一些代码,它应该作为一个单独的线程运行:

template<class Iterator>
void thread_launcher(Iterator start, Iterator fin, size_t sort_type) {
    // Blah blah
    mixed_sort<less<int>>(start, fin, sort_type);
    // blah blah
}

这段代码应该创建这个帖子:

for (size_t sort_type = 2; sort_type!= 7; ++sort_type) {
    // blah
    t[sort_type] = thread(thread_launcher, copy.begin(), copy.end(), sort_type);
}

,其中tthread的数组。

问题是---当我尝试编译时,我收到此错误:

main.cpp:245:32: error: no matching constructor for initialization of
      'std::__1::thread'
  ...= thread(thread_launcher, copy.begin(), copy.end(), sort_type);
       ^      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/thread:349:9: note: 
      candidate template ignored: couldn't infer template argument '_Fp'
thread::thread(_Fp&& __f, _Args&&... __args)

我不明白我做错了什么,虽然这是我第一次使用多线程,更不用说std::thread了。我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:1)

如果没有所有细节,并不完全确定,但令人惊讶的是你将thread_launcher作为参数传递。这不是一个函数,而是一个函数模板

请考虑以下事项:

template<typename T>
void foo(T)
{

}


int main()
{
    thread t(foo<int>, 3);
    return 0;
}

通过我,这构建,但当我将其更改为

thread t(foo, 3);

无法构建。

那么,你可能希望将事情改为

thread(
     thread_launcher<decltype(begin(copy))>, 
     begin(copy),
     end(copy), 
     sort_type)