头文件中定义的线程函数给出类型强制转换错误
Thread function defined in header file is giving type cast errors
请看下面的代码
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);
为什么会这样?请帮助!
非静态方法与静态或全局方法具有不同的类型。请记住,非静态成员函数有一个隐藏的参数,该参数是this
指针,因此您的serverThread
函数本质上具有这样的签名:
DWORD WINAPI serverThread(Server *this, LPVOID param);
所以你可以看到为什么这不起作用(甚至使用cast也不起作用——会发生奇怪的可怕的事情)。
为了使其与LPTHREAD_START_ROUTINE兼容,您需要将其设置为静态,因为静态成员函数不操作类的特定实例,因此不需要this
指针:
static DWORD WINAPI serverThread(LPVOID param);
而不是传递acceptSocket作为lpParameter给CreateThread,传递this:
hdl = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)serverThread, this,0,&threadId);
在serverThread内部,你仍然可以通过Server对象访问acceptSocket成员。
相关文章:
- 类没有命名C++代码中的类型错误
- 不完整类型错误(E0409、E0070、E0515)
- 使用具有结构不完整类型错误的模板
- 不命名构造函数和析构函数上的类型错误
- 返回派生类型时出现协变类型错误
- 为什么此构造函数没有给出不完整的类型错误?
- 定义模板化结构的特征时出现不完整的类型错误
- 使用重载构造函数时出现不完整的类型错误
- 为什么我得到表达式必须有类类型错误?
- 输出 [left]=input[i] 行中的 c++ 代码中存在无效的类型错误
- 枚举成员不是类型错误
- 如何修复"ctypes"。参数错误:参数 2:<键入"异常.类型错误">:RaspberryPi 中的错误类型"错误
- 外部 "C" Visual Studio 2015 中的显式类型错误,DLL 测试代码
- 非默认析构函数会导致不完整的类型错误
- 为什么按引用传入会导致绑定引用类型错误
- Objective-C C++ 包装器 类型错误的不完整定义
- 输入类型错误
- 当构造函数的参数类型错误时引发异常
- 命名空间中的'bad_cast' 'std' 未命名类型错误
- C UNWORKOWN类型错误