'invoke': 未找到匹配的重载函数

'invoke': no matching overloaded function found

尝试用多线程制作一个有组织的“公告”留言板。 一个线程读取消息并调用另一个线程将所述消息发送给连接的用户。

我不完全确定为什么 std::thread 构造函数无法编译。我已经 ref() 尝试了所有方法,但没有用。我试过 ref() 只引用需要引用的内容,但没有用。

#include <queue>
#include <string>
#include <set>
#include <fstream>
#include <thread>

namespace MenuVariables {
    std::set<std::string> usernames;
    std::queue<std::string> messages;
}

namespace MessageHandler {
    void readMessages(std::queue<std::string>& messages, std::string inputFile);
    void sendMessages(std::queue<std::string>& messages, std::set<std::string>& users, std::ofstream outputFile);
}

int main() {
    std::string inputFile = "data.txt";
    std::ofstream outputFile("output.txt");
    
    std::thread readThread(MessageHandler::readMessages, std::ref(MenuVariables::messages), inputFile);
    std::thread sendThread(MessageHandler::sendMessages, std::ref(MenuVariables::messages), std::ref(MenuVariables::usernames), outputFile);
    readThread.detach();
    sendThread.detach();
    return 0;
}

我该怎么办? 错误是:

sendMessages 按值取 std::ofstream,因为 std::ofstream 不可复制,即使没有 std::thread 你也只能用临时值或 r 值调用它。

例如,这不会编译:

MessageHandler::sendMessages(MenuVariables::messages, MenuVariables::usernames, outputFile);

但其中任何一个都会:

MessageHandler::sendMessages(MenuVariables::messages, MenuVariables::usernames, std::move(outputFile));
MessageHandler::sendMessages(MenuVariables::messages, MenuVariables::usernames, ofstream("output.txt"));

因此,您可以使用相同的选项来使 std::thread 构造函数工作:

thread sendThread(MessageHandler::sendMessages, ref(MenuVariables::messages), ref(MenuVariables::usernames), std::move(outputFile));
thread sendThread(MessageHandler::sendMessages, ref(MenuVariables::messages), ref(MenuVariables::usernames), ofstream("output.txt"));

或者更改 sendMessages 以引用 outputFile

void sendMessages(queue<string>& messages, set<string>& users, ofstream& outputFile);