问题解决: invalid static_cast from type 'unresolved overloaded function type' to type 'xxx'

引言

在编写一个多线程的代码时遇到这个问题,在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

posted @ 2022-07-02 13:18  李兆龙的博客  阅读(0)  评论(0编辑  收藏  举报