'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);
尝试用多线程制作一个有组织的“公告”留言板。 一个线程读取消息并调用另一个线程将所述消息发送给连接的用户。
我不完全确定为什么 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);