我遇到了与模板函数和线程有关的问题:
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()
答案 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;
}
注意:此问题被标记为重复,因此使用较新的语言功能进行了添加。