簡體   English   中英

線程構造函數中的非標准語法錯誤

[英]Non-Standard Syntax Error in Thread Constructor

我目前正在考慮制作一個 C++ 庫。 我對 C++ 沒有太多經驗,並且可能有一個關於類實例方法調用的非常基本的問題。

主文件

msgserver m;
std::thread t1(m.startServer, "192.168.50.128", 8081);

消息服務器.h

class msgserver
{
public:    
    msgserver() { }
    int startServer(std::string addr, int port);
};

消息服務器.cpp

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM