请查看以下代码
Server.h
#pragma once
class Server
{
public:
Server(void);
~Server(void);
DWORD WINAPI serverThread(LPVOID param);
private:
SOCKADDR_STORAGE from;
int retval, fromlen, socket_type;
char servstr[NI_MAXSERV],hoststr[NI_MAXHOST];
SOCKET serverSocket, acceptSocket;
};
Server.cpp
此处显示一小部分。
Server:Server()
{
//Code
//Passing data to thread
DWORD threadId;
HANDLE hdl;
hdl = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE) serverThread,(LPVOID)acceptSocket,0,&threadId);
//Code
}
DWORD WINAPI Server::serverThread(LPVOID param)
{
//code
}
此代码正在生成错误
error C2440: 'type cast' : cannot convert from 'overloaded-function' to 'LPTHREAD_START_ROUTINE'
那是从
行开始的hdl = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE) serverThread,(LPVOID)acceptSocket,0,&threadId);
这是为什么?请帮忙!
答案 0 :(得分:5)
非静态方法与静态或全局方法的类型不同。请记住,非静态成员函数有一个隐藏参数,即this
指针,因此您的serverThread
函数本质上具有这样的签名:
DWORD WINAPI serverThread(Server *this, LPVOID param);
所以你可以看出为什么这不起作用(并且无法使用甚至进行演员表演 - 会发生奇怪的恐怖)。
为了使其与LPTHREAD_START_ROUTINE兼容,您需要将其设置为静态,因为静态成员函数不能在类的特定实例上运行,因此不需要this
指针:
static DWORD WINAPI serverThread(LPVOID param);
而不是将acceptSocket作为lpParameter传递给CreateThread,而是传递这个:
hdl = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)serverThread, this,0,&threadId);
在serverThread内部,您仍然可以通过Server对象访问acceptSocket成员。