引言
在编写一个多线程的代码时遇到这个问题,在csdn,博客园查询无果后在stackoverflow上得到了解答,遂在解答后分享出来,希望能帮到有同样问题的朋友.
问题复现
不贴上本来的代码 简单的写一个语义相同的小demo
class A{
public:
int funa(){
cout << "int()\n";
}
int funa(int para){
cout << "int(int)\n";
}
};
int main(){
std::vector<std::thread> threads(2);
A Temp;
typedef int(A::*function)(int);
function f = &A::funa;
for(size_t i = 0; i < 2; i++){
threads[i] = std::thread(&A::funa, &Temp, 1024);
}
std::for_each(threads.begin(), threads.end(), std::mem_fn(&std::thread::join));
return 0;
}
简单说一下上面代码所表达的意思 就是我们的类中现在有了一个重载的函数 当我们把重载的函数放入std::thread的参数的时候就会报错 错误如下
error:
no matching function for call to ‘std::thread::thread(<unresolved overloaded function type>, A*, int)’
threads[i] = std::thread(&A::funa, &Temp, 1024);
我们重点来看报错中的这一句话 unresolved overloaded function type 未解决的重载函数类型 其实就是你有多个函数名称都为funa 编译器不知道选择哪一个 需要你来指定一个 我们该如何写呢 如下所示:
typedef int(A::*function)(int);
function f = &A::funa;
for(size_t i = 0; i < 2; i++){
threads[i] = std::thread(f, &Temp, 1024);
}
这样我们就可以指定一种类型 然后就可以编译成功了
还有一种情况 也对应这一种更优的解决方案
int funa(){
cout << "int()\n";
}
int funa(int para){
cout << "int(int)\n";
}
int main(){
std::vector<std::thread> threads(2);
A Temp;
typedef int(A::*function)(int);
function f = &A::funa;
for(size_t i = 0; i < 2; i++){
threads[i] = std::thread(funa, 1024);
}
std::for_each(threads.begin(), threads.end(), std::mem_fn(&std::thread::join));
return 0;
}
我们可以看到唯一的区别是把std::thread中的函数调用从成员函数变成了一般的函数,它们的差别就是没有参数中隐式的this指针,也就意味着我们可以用一种更优的解决方案 即强制类型转换
threads[i] = std::thread(static_cast<int(*)(int)>(funa), 1024);
问题到这里就解决了,但是在解决这个问题之后发这篇博客之前我遇到了一个问题 现在还是没有解决 即:
参数为泛型函数时如何指定?
这是个问题 当为泛型时相当于一个函数族,且没有进行实例化,现在还没有解决,全网也没有搜到,希望知道的朋友能留下宝贵的评论!
参考:
https://stackoverflow.com/questions/19539327/overloading-class-member-function
https://stackoverflow.com/questions/44908313/no-matching-function-for-call-to-stdthreadthreadunresolved-overloaded-fun