没有匹配函数来调用 <unresolved overloaded function type>

no matching function for call to <unresolved overloaded function type>

我无法回答类似的问题。那是我的 MRE,基本上我想用接受模板引用的版本重载 fun。这一切都有效,直到 std::thread 进入游戏。看来我从它的构造函数中遗漏了一些东西。

g++-10 上显示的错误是

error: no matching function for call to ‘std::thread::thread(<unresolved overloaded function type>, std::string, std::shared_ptr<MySem>)’
   43 |   std::make_shared<MySem>());
#include <string>
#include <memory>
#include <thread>

class MyData
{};

class MySem
{};

template <typename T, typename Sem>
void fun(T & t, const std::string & TAG, std::shared_ptr<Sem> upSem)
{}

template <typename T, typename Sem>
void fun(const std::string & TAG, std::shared_ptr<Sem> upSem)
{
    T t;
    fun(t, TAG, upSem);  // NO std::ref(t)
}

int main(int argc, char ** argv)
{
    MyData d;

    fun<MyData, MySem>(
        "works",
        std::make_shared<MySem>());

    fun<MyData, MySem>(
        d,
        "this too",
        std::make_shared<MySem>());


    std::thread t1(fun<MyData, MySem>,
        std::string("this doesn't"),
        std::make_shared<MySem>());               // line 43

    std::thread t2(fun<MyData, MySem>,
        d,
        std::string("this neither"),
        std::make_shared<MySem>());

    return 0;
}

如果您有一个重载函数并想选择一个特定的重载,您必须手动转换它以获得正确的函数,例如:

std::thread t1(static_cast<void(*)(const std::string&, std::shared_ptr<MySem>)>(&fun<MyData, MySem>),
        std::string("this doesn't"),
        std::make_shared<MySem>());               // line 43

正如“Passer By”的评论中已经给出的那样,使用 lambda 可以大大简化整个过程并使代码更具可读性。

另见此处:other answer

我的猜测是 std::thread 的构造函数无法解析您要调用的 fun 的哪个重载。不知道为什么。

只有一个版本的 fun 例如

template <typename T, typename sem>
void fun(const std::string&, std::shared_ptr<sem>)
{
    ...
}

允许您构建 t1 很好(但 t2 显然会失败)。

解决方法是改为传递 lambda,例如:

std::thread t3([&](){fun<data, sem>(d, "works again", std::make_shared<sem>());});
std::thread t4([&](){fun<data, sem>("this too", std::make_shared<sem>());});

问题与 std::thread 函数无关,问题是编译器不知道您请求的是哪个重载函数,使用 lambda 作为解决方法可以解决这个问题:

    std::thread t1([=]{ 
        fun<MyData, MySem>(std::string("This doesn't"),  std::make_shared<MySem>()); 
        } );
    t1.join();