C++ ';调用';:找不到匹配的重载函数

C++ ';调用';:找不到匹配的重载函数,c++,multithreading,std,C++,Multithreading,Std,尝试使用多线程制作有组织的“公告”留言板。 一个线程读取消息并调用另一个线程将所述消息发送给连接的用户 我不完全清楚为什么std::thread构造函数无法编译。我尝试了ref()。我尝试了ref()ing只引用需要引用的内容,但没有成功 #include <queue> #include <string> #include <set> #include <fstream> #include <thread> namespace Me

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

我不完全清楚为什么std::thread构造函数无法编译。我尝试了
ref()。我尝试了
ref()
ing只引用需要引用的内容,但没有成功

#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;
}
#包括
#包括
#包括
#包括
#包括
名称空间菜单变量{
设置用户名;
std::队列消息;
}
命名空间消息处理程序{
void readMessages(std::queue&messages,std::string inputFile);
void sendMessages(std::queue&messages、std::set&users、std::ofstream outputFile);
}
int main(){
std::string inputFile=“data.txt”;
std::of流输出文件(“output.txt”);
std::threadthread(MessageHandler::readMessages,std::ref(MenuVariables::messages),inputFile);
std::thread sendThread(MessageHandler::sendmages,std::ref(MenuVariables::messages),std::ref(MenuVariables::usernames),outputFile);
readThread.detach();
sendThread.detach();
返回0;
}
我该怎么办? 错误是:
sendmages
按值获取
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"));
或者将
sendmages
更改为通过引用获取
outputFile

void sendMessages(queue<string>& messages, set<string>& users, ofstream& outputFile);
void发送消息(队列和消息、集合和用户、流和输出文件);

此问题显示的代码不符合stackoverflow.com的要求。这意味着这里的任何人都不可能最终回答这个问题;但最多只能猜测。你的问题应该显示一个最小的例子,不超过一到两页的代码(“最小”部分),其他人可以剪切/粘贴、编译、运行和复制所描述的问题(“可复制”部分),完全如图所示(这包括任何辅助信息,如程序输入)。有关更多信息,请参阅。它是否仅在第一次调用线程时编译<代码>线程读取线程(MessageHandler::readMessages,ref(MenuVariables::messages),inputFile)?它不应更改任何内容,但您可以在
MessageHandler
前面添加
&
,检查您的包含是否包含集合和队列,我在您的.hMy中没有看到
菜单变量::用户名
,复制粘贴了错误的代码。MenuVariables.h现在应该出现在问题中。它不会在删除writeThread的情况下编译,但现在有一个不同的符号错误:MenuVariable::messages已在MenuFunctions中定义。obj
sendMessages
按值获取流的
,这需要复制它,但流的
不可复制。您正在传递的
ref(outputFile)
-无法编译,因为它与
sendmages
的签名不匹配。