头文件中定义的线程函数给​​出了类型转换错误

Pea*_*Gen 0 c++ multithreading visual-studio-2010

请查看以下代码

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;
};
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

此代码生成错误

 error C2440: 'type cast' : cannot convert from 'overloaded-function' to 'LPTHREAD_START_ROUTINE'
Run Code Online (Sandbox Code Playgroud)

这是从线

hdl = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE) serverThread,(LPVOID)acceptSocket,0,&threadId);
Run Code Online (Sandbox Code Playgroud)

为什么是这样?请帮忙!

use*_*015 5

非静态方法与静态或全局方法具有不同的类型.请记住,非静态成员函数有一个隐藏参数作为this指针,因此您的serverThread函数本质上具有如下签名:

DWORD WINAPI serverThread(Server *this, LPVOID param);
Run Code Online (Sandbox Code Playgroud)

所以你可以看出为什么这不起作用(即使是演员也行不通- 会发生奇怪的恐怖).

为了使其与LPTHREAD_START_ROUTINE兼容,您需要将其设置为静态,因为静态成员函数不能在类的特定实例上运行,因此不需要this指针:

static DWORD WINAPI serverThread(LPVOID param);
Run Code Online (Sandbox Code Playgroud)

而不是将acceptSocket作为lpParameter传递给CreateThread,传递这个:

hdl = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)serverThread, this,0,&threadId);
Run Code Online (Sandbox Code Playgroud)

在serverThread内部,您仍然可以通过Server对象访问acceptSocket成员.