我头文件写的是:
protected:
// 处理完成端口的消息的线程函数
DWORD WINAPI WorkerThread(LPVOID);
.cpp使用的时候,是:
m_WorkProcId[i]=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&CnetserverDlg::WorkerThread,CompletionPort, 0, &dwThreadId);可是它报错,说是;
error C2440: “类型转换”: 无法从“DWORD (__stdcall CnetserverDlg::* )(LPVOID)”转换为“LPTHREAD_START_ROUTINE”请问这个原因是什么啊?

解决方案 »

  1.   

    (LPTHREAD_START_ROUTINE)CnetserverDlg::WorkerThread
      

  2.   

    error C2440: “类型转换”: 无法从“overloaded-function”转换为“LPTHREAD_START_ROUTINE”
    1>        在匹配目标类型的范围内没有具有该名称的函数还是不行啊
      

  3.   

    函数名本身就代表一个地址,所以&符号去掉,另外,线程函数必须是全局函数或是静态成员函数
      

  4.   

    我用了static做前缀,就可以了,,,但是为何我用了静态以后,,我只要在静态函数里面,用了类里面私有的数据,就会报错,说:
    1>d:\jl\netserver\netserver\netserverdlg.cpp(125) : error C2597: 对非静态成员“CnetserverDlg::m_serverSocket”的非法引用
    1>d:\jl\netserver\netserver\netserverdlg.cpp(127) : error C2597: 对非静态成员“CnetserverDlg::CompletionPort”的非法引用这2个变量,不能是静态的啊,请问有什么可以解决的不?
      

  5.   

    static 或者不要作为类的成员函数
      

  6.   

    一个函数,如何用友元哦??
    我现在的就是:
    DWORD WINAPI WorkerThread(LPVOID);// CnetserverDlg 对话框
    class CnetserverDlg : public CDialog
    {
    private:
    //完成端口
    HANDLE CompletionPort;
    // 服务器SOCKET
    SOCKET m_serverSocket;
    }
      

  7.   


    extern DWORD WINAPI WorkerThread(LPVOID); 
    // CnetserverDlg 对话框 
    class CnetserverDlg : public CDialog 
    { friend DWORD WINAPI WorkerThread(LPVOID); 
    private: 
    //完成端口 
    HANDLE CompletionPort; 
    // 服务器SOCKET 
    SOCKET m_serverSocket; 
    }
      

  8.   

    友元也用了,,发现还是无法访问,例子如下:
    // 开始监听的线程函数
    void WINAPI ListenProc();
    // 处理完成端口的消息的线程函数
    DWORD WINAPI WorkerThread(LPVOID);
    class CnetserverDlg : public CDialog
    {
    // 构造
    public:
    friend void WINAPI ListenProc();
    friend DWORD WINAPI WorkerThread(LPVOID);
    private: 
    //完成端口 
    HANDLE CompletionPort; 
    // 服务器SOCKET 
    SOCKET m_serverSocket; 
    }
    void WINAPI ListenProc()
    {
    // 临时客户端的SOCKET
    SOCKET                   sClient;
    int                      iaddrSize = sizeof(SOCKADDR_IN);
    PPER_IO_DATA lpPerIOData;
    while (TRUE)
    {
    sClient = accept(m_serverSocket, (struct sockaddr *)&sClient, &iaddrSize);//<----这里报错: error C2065: “m_serverSocket”: 未声明的标识符
    }
      

  9.   

    写两个函数, 
    一个是全局的线程入口函数, 如DWORD WINAPI ThreadEntry(LPVOID p);
    一个是真正的线程处理函数, 而且是你的类的成员函数, 如CYourClass::DoThread(...);将ThreadEntry做为CreateThread(...)的参数, 将CYourClass指针做为ThreadEntry(...)的参数, 并在ThreadEntry中调用CYourClass::DoThread。
      

  10.   

    友元也应该使用类来引用。
    比如, 将void WINAPI ListenProc() 改为void WINAPI ListenProc(CnetserverDlg* pDlg);
    然后再在ListenProc函数体中这样引用:pDlg->m_serverSocket;