我無法與類似的問題聯系起來。那是我的 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;
}
uj5u.com熱心網友回復:
如果您有一個多載函式并且想要選擇一個特定的多載,則必須手動轉換它以獲得正確的函式,例如:
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 可以大大簡化整個事情并使代碼更具可讀性。
另見此處:其他答案
uj5u.com熱心網友回復:
我的猜測是建構式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>());});
uj5u.com熱心網友回復:
問題與std::thread函式無關,問題是編譯器不知道您請求的是哪個多載函式,使用 lambda 作為解決方法可以完成這項作業:
std::thread t1([=]{
fun<MyData, MySem>(std::string("This doesn't"), std::make_shared<MySem>());
} );
t1.join();
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/445346.html
