[英]Non-Standard Syntax Error in Thread Constructor
我目前正在考慮制作一個 C++ 庫。 我對 C++ 沒有太多經驗,並且可能有一個關於類實例方法調用的非常基本的問題。
msgserver m;
std::thread t1(m.startServer, "192.168.50.128", 8081);
class msgserver
{
public:
msgserver() { }
int startServer(std::string addr, int port);
};
int msgserver::startServer(string addr, int port)
此代碼導致:
[C3867] 'msgserver::startServer': non-standard syntax; use '&' to create a pointer to member
我知道我可以通過將此方法設為靜態來修復編譯器錯誤,但我不確定這是否是在線程構造函數中調用它(不允許調用簽名上的括號)這一事實所強加的要求,或者如果我需要弄清楚語法。
我已經閱讀了這個,它實際上讓我在開始時更加困惑。 似乎我應用的任何修復都像:
int &msgserver::startServer(string addr, int port)
or
std::thread t1(&m.startServer, "192.168.50.128", 8081);
根據編譯器實際上是非法語法。
我如何將其稱為實例方法? 或者在靜態函數上啟動在后台運行的線程實際上是一個好主意?
獲取成員函數指針的語法是&<class name>::<function_name>
。
在這種情況下&msgserver::startServer
將是正確的表達式。 由於在后台線程上使用了std::invoke
,因此您需要傳遞對象以調用函數作為std::thread
的第二個構造函數參數,或者包裝在std::reference_wrapper
或通過傳遞指針:
std::thread t1(&msgserver::startServer, std::ref(m), "192.168.50.128", 8081);
或者
std::thread t1(&msgserver::startServer, &m, "192.168.50.128", 8081);
代替
msgserver m;
std::thread t1(m.startServer, "192.168.50.128", 8081);
使用lambda 函數
msgserver m;
std::thread t1([=](std::string addr, int port){ m.startServer(addr, port); },
"192.168.50.128", 8081);
我猜你希望你的版本通過某種 C++ 魔法來完成 lambda 函數所做的事情。 但這不是 C++ 的工作方式。
完全贊同你獲得一本 C++ 書籍的建議。 現在,您可以將 lambda 函數添加到要學習的主題列表中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.