gpt4 book ai didi

c++ - 试图创建一个线程来向套接字发送消息。获得 2 个与线程构造函数有关的错误

转载 作者:行者123 更新时间:2023-12-01 14:49:30 25 4
gpt4 key购买 nike

我正在尝试创建一个线程以便向打开的套接字发送消息。我收到 2 个特定错误。

E0289: No instance of constructor "std::thread::thread" matches the argument list.

C2661: 'std::thread::thread' no overloaded function takes 2 arguments**



我找到了关于此的类似帖子,但仍然无法弄清楚是否可以真正使用一些说明。
#include <WS2tcpip.h>
#include <string>
#include <thread>

using namespace std;

#pragma comment (lib, "ws2_32.lib")

void SendMessage(string message)
{
WSAData data;
WORD version = MAKEWORD(2, 2);
int wsOk = WSAStartup(version, &data);
if (wsOk != 0)
{
cout << "Failed, Error Code: " << WSAGetLastError() << endl;
}

sockaddr_in user;
user.sin_family = AF_INET;
user.sin_port = htons(3514);
inet_pton(AF_INET, "127.0.0.1", &user.sin_addr);

SOCKET out = socket(AF_INET, SOCK_DGRAM, 0);

int sendMsg = sendto(out, message.c_str(), message.size() + 1, 0, (sockaddr*)&user, sizeof(user));

if (sendMsg == SOCKET_ERROR)
{
cout << "Failed, Error: " << WSAGetLastError() << endl;
}

closesocket(out);
WSACleanup();
}

int main()
{
string message = "";
cout << "Enter a message to send: ";
cin >> message;

thread sendtoSocket (SendMessage, message);

sendtoSocket.join();

system("pause");
return 0;
}

最佳答案

Windows has a SendMessage macroSendMessageA 之间透明切换和 SendMessageW功能取决于是否启用 unicode。这个宏替换正在践踏你的 SendMessage功能。

你可以加

#undef SendMessage

之后的任何地方
#include <WS2tcpip.h>

但这可能会导致以后出现问题。我认为你最好改变你的名字 SendMessage作用于不碰撞的东西。

TL;DR 版本

为什么这是个问题?歧义。让我们将其分解为 MCVE .
#include <WS2tcpip.h>
#include <string>
#include <thread>
#include <iostream>

using namespace std;

void SendMessage(string /*message*/)
{
}

int main()
{
string message = "Test";

thread sendtoSocket (SendMessage, message);

sendtoSocket.join();
}

在预处理器之后,程序看起来像
void SendMessageW(string /*message*/)
{
}

int main()
{
string message = "Test";

thread sendtoSocket (SendMessageW, message);

sendtoSocket.join();
}

编译器现在必须找出哪个 SendMessageW过载它必须调用 thread sendtoSocket (SendMessageW, message); 、提问者的或 Win32 API 函数,但它不能。这会导致编译器寻找额外的线程构造函数并产生误导性的诊断信息。

看看这是怎么回事,我们需要一个更简单的 MCVE,其中模板化函数没有重载
void A(int )
{
}

void A(double )
{
}

template<typename FUNC, typename... ARGS>
void test(FUNC&& func, ARGS&&... args)
{
func(args...);
}


int main()
{
int message = 10;
test(A, message);
}

这会导致有意义的诊断:

error C2672: 'test': no matching overloaded function found

error C2783: 'void test(FUNC &&,ARGS &&...)': could not deduce template argument for 'FUNC'

关于c++ - 试图创建一个线程来向套接字发送消息。获得 2 个与线程构造函数有关的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59002610/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com