C++ 头文件中定义的线程函数给出类型转换错误
请看一下下面的代码 Server.hC++ 头文件中定义的线程函数给出类型转换错误,c++,multithreading,visual-studio-2010,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[
#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
这里显示了一小部分
此代码正在生成错误
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);
为什么会这样?请帮忙 非静态方法与静态或全局方法的类型不同。请记住,非静态成员函数有一个隐藏参数,即
this
指针,因此您的serverThread
函数本质上具有如下签名:
DWORD WINAPI serverThread(Server *this, LPVOID param);
所以,你可以看到为什么这不起作用(甚至连演员都不起作用——奇怪的恐怖会发生)
为了使其与LPTHREAD_START_例程兼容,您需要将其设置为静态,因为静态成员函数不在类的特定实例上操作,因此不需要此
指针:
static DWORD WINAPI serverThread(LPVOID param);
而不是将acceptSocket作为lpParameter传递给CreateThread,而是传递该参数:
hdl = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)serverThread, this,0,&threadId);
在serverThread内部,您仍然可以通过服务器对象访问acceptSocket成员。非静态方法的类型与静态或全局方法不同。请记住,非静态成员函数有一个隐藏参数,即
this
指针,因此您的serverThread
函数本质上具有如下签名:
DWORD WINAPI serverThread(Server *this, LPVOID param);
所以,你可以看到为什么这不起作用(甚至连演员都不起作用——奇怪的恐怖会发生)
为了使其与LPTHREAD_START_例程兼容,您需要将其设置为静态,因为静态成员函数不在类的特定实例上操作,因此不需要此
指针:
static DWORD WINAPI serverThread(LPVOID param);
而不是将acceptSocket作为lpParameter传递给CreateThread,而是传递该参数:
hdl = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)serverThread, this,0,&threadId);
在serverThread内部,您仍然可以通过服务器对象访问acceptSocket成员。A
DWORD(WINAPI服务器::*)(LPVOID)
不是DWORD(WINAPI*)(LPVOID)
@chris:OK,那么您的意思是不能将其放入头文件?@JesseGood:不,不是。没有公认的答案。并且没有头文件。您必须将serverThread函数定义为静态函数,而不是类成员。DWORD(WINAPI服务器:*)(LPVOID)
不是DWORD(WINAPI*)(LPVOID)
@chris:OK,那么您的意思是不能将其纳入头文件?@JesseGood:不,不是。没有公认的答案。并且没有头文件。您必须将serverThread函数定义为静态函数,而不是类成员。hmmm。。。有趣!不管怎么说,不需要的静态内容会在将来产生问题,不是吗?在这种情况下,我需要在.cpp中定义它并初始化它,而不是在.h right?@Yohan中。这实际上是一个非常常见的静态成员函数的有效用法。您只需将其用作“垫片”,将传递给线程的参数转换为指向类实例的指针,然后在该指针上调用某个成员函数。我不知道你说的“初始化”是什么意思,因为你不必初始化函数。与所有成员函数一样,您可以在头文件中声明它并在单独的.cpp
文件中定义它,也可以在头文件中声明它。谢谢!我真的很感谢你的帮助:)@NikBougalis:非常感谢你的编辑:)嗯。。。有趣!不管怎么说,不需要的静态内容会在将来产生问题,不是吗?在这种情况下,我需要在.cpp中定义它并初始化它,而不是在.h right?@Yohan中。这实际上是一个非常常见的静态成员函数的有效用法。您只需将其用作“垫片”,将传递给线程的参数转换为指向类实例的指针,然后在该指针上调用某个成员函数。我不知道你说的“初始化”是什么意思,因为你不必初始化函数。与所有成员函数一样,您可以在头文件中声明它并在单独的.cpp
文件中定义它,也可以在头文件中声明它。谢谢!非常感谢您的帮助:)@NikBougalis:非常感谢您的编辑:)