Ошибка 3, ошибка C2440: «инициализация»: невозможно преобразовать из «void *» в «Socket *»

У меня проблема, когда я имплантирую конструктор по умолчанию, но у меня есть ошибка

Ошибка 3, ошибка C2440: «инициализация»: невозможно преобразовать из «void *» в «Socket *» Webserver.h 164 1 Project2_SocketLib

Socket.h
    //SOCKET Accept(sockaddr* clientInfo,int* clientInfoSize)
    SOCKET Accept()
    {
        static int size = sizeof(sockaddr);
        return accept(this->hSocket, 0,0);
    }
Webserver.h
    Webserver(short port_to_listen,request_func rf,HWND Hwnd, WPARAM wParam, LPARAM lParam)
    {
        Socket in(port_to_listen,"INADDR_ANY", true, Hwnd, true);

        //request_func = rf;

        while (1) {
            Socket* ptr_s =(void*) in.Accept();

            unsigned ret;
            _beginthreadex(0,0,Request, ptr_s,0,&ret);
        }

    }

person Community    schedule 21.03.2014    source источник
comment
typedef UINT_PTR SOCKET;   -  person    schedule 21.03.2014
comment
Какая связь между SOCKET и Socket? Предположительно SOCKET - это опечатка.   -  person codah    schedule 21.03.2014


Ответы (3)


Почему вы явно приводите типы к void *

 Socket* ptr_s =(void*) in.Accept();

Должно быть,

Socket sock = in.Accept();

Accept возвращает СОКЕТ. Нет необходимости преобразовывать его в void * или Socket *

person Pranit Kothari    schedule 21.03.2014

Я надеюсь это сработает

Socket* ptr_s =static_cast<Socket*>( in.Accept());
person Shah Jafar Ulla Hamidi    schedule 08.10.2020

В C ++, в отличие от C, void* нельзя неявно преобразовать в указатель на объект. Вместо этого вы должны привести напрямую к типу целевого указателя:

Socket* ptr_s = reinterpret_cast<Socket*>(in.Accept());

Примечание. Предпочитайте приведение типов в стиле C ++, а не в стиле C. Они более ясны в своих намерениях, и их легче искать.

person Brian Bi    schedule 21.03.2014