调用线程时,模板函数不会编译

时间:2011-12-01 14:22:56

标签: c++ multithreading templates c++11

我遇到了与模板函数和线程有关的问题:

template <class TYPE_size>
void Threader(TYPE_size counter)
{
    counter++;
}
int main()
{
    unsigned int counter = 100;
    thread one(Threader,counter);
    one.join();    
    cout << counter;
}

这不编译;我明白了:

  

错误:没有匹配的调用函数   âstd:: thread :: thread(,unsigned   INT&安培;)A

如果我删除它编译的模板,如果我将函数调用更改为标准函数调用而不是线程(仍使用模板),则编译。

有谁知道这是为什么?

我正在使用Centos5 64位。

 error: no matching function for call to âstd::thread::thread(<unresolved overloaded function type>, unsigned int&)â
/usr/lib/gcc/x86_64-redhat-linux6E/4.4.0/../../../../include/c++/4.4.0/thread:124: note: candidates are: std::thread::thread(std::thread&&)
/usr/lib/gcc/x86_64-redhat-linux6E/4.4.0/../../../../include/c++/4.4.0/thread:122: note:                 std::thread::thread(const std::thread&)
/usr/lib/gcc/x86_64-redhat-linux6E/4.4.0/../../../../include/c++/4.4.0/thread:121: note:                 std::thread::thread()

4 个答案:

答案 0 :(得分:7)

没有名为Threader的功能。当您编写Threader<int>或其他内容时,编译器会创建一个函数。如果然后编写Threader<float>,则编译器会创建一个新函数。您可以提供默认模板参数,也可以在调用时为其指定参数。

template <class TYPE_size=int>

thread one(Threader<int>, counter);

答案 1 :(得分:5)

我冒昧地提供各种修复来实现我认为的预期行为:

#include <thread>

template <typename T>
void Threader(T & counter)    // take by reference!
{
   counter++;
}

int main()
{
   unsigned int counter = 100;
   std::thread one(Threader<unsigned int>,   // specify template *instance*
                   std::ref(counter) );      // pass variable as reference
   one.join();
   return counter;
}

答案 2 :(得分:4)

您缺少模板的参数列表。

尝试:

 unsigned int counter = 100;
 thread one(Threader<unsigned int>,counter);

或者,如果您使用的是c ++ x0 / c ++ 11标准,请为您的模板指定一个标准类型:

template <typename TYPE_size = unsigned int>
void Threader(TYPE_size counter)
{
    counter++;
}
int main()
{
    unsigned int counter = 100;
    thread one(Threader<>,counter);
    one.join();    
    cout << counter;
}

答案 3 :(得分:0)

C ++ 11引入了lambdas,在这种情况下也可以使用它。

基本上,线程是使用lambda创建的,lambda调用该函数然后允许进行模板类型推导。

thread one([counter]() { Threader(counter); });

上面,计数器按值捕获,但正如一些答案所示,也可以使用引用捕获

#include <iostream>
#include <thread>
template <class T>
void Threader(T& counter)
{
    counter++;
}
int main()
{
    unsigned int counter = 100;
    std::thread one([&counter]() { Threader(counter); });
    one.join();    
    std::cout << counter;
}

注意:此问题被标记为重复,因此使用较新的语言功能进行了添加。