没有匹配函数来调用 <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();
我无法回答类似的问题。那是我的 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();