ошибка компиляции при создании потока с функцией-членом с аргументом ref - PullRequest
0 голосов
/ 05 февраля 2020

я пытаюсь сделать std :: tread, поэтому я уже смотрю какой-то учебник, но когда я делаю то же самое (я думаю), он не компилируется.

это мой класс Network_, член receiveFromServer функция должна быть многопоточной.

class Network_ {
public:
    bool errorInfo(sf::Socket::Status status) {
        switch (status)
        {
        case sf::Socket::Done:
            return true;
            break;
        case sf::Socket::NotReady:
            std::cout << "The socket is not ready to send / receive data yet." << std::endl;
            return false;
            break;
        case sf::Socket::Partial:
            std::cout << "The socket sent a part of the data." << std::endl;
            return false;
            break;
        case sf::Socket::Disconnected:
            std::cout << "The socket has been disconnected." << std::endl;
            return false;
            break;
        case sf::Socket::Error:
            std::cout << "An unexpected error happened." << std::endl;
            return false;
            break;
        default:
            return false;
            break;
        }
    }

    void receiveFromServer(sf::RenderWindow &RW) {
        sf::Packet packet;
        std::string string;

        while (RW.isOpen())
            if (_selector.wait() && _selector.isReady(_socket)) {
                if (errorInfo(_socket.receive(packet))) {
                    packet >> string;
                    packet.clear();
                    std::cout << string << std::endl;
                }
            }
            else
                RW.close();
    }

private:
    sf::SocketSelector _selector;
    sf::TcpSocket _socket;

, и это часть моего основного

Network_ network;

if (network.connectToServer(ip, port)) {
    Window_ window;
    sf::RenderWindow *RW = window.create_window("test", 10);
    std::thread receiveThread(&Network_::receiveFromServer, &network, std::ref(RW));

    return gameLoop(*RW);
}

, и я получил эту ошибку static assertion failed: std::thread arguments must be invocable after conversion to rvalues с большим количеством sh* т внизу.

Может кто-нибудь помочь мне, пожалуйста? спасибо:)

1 Ответ

1 голос
/ 05 февраля 2020

Ваша функция receiveFromServer ожидает ссылку на sf::RenderWindow, но вы передаете sf::RenderWindow*&.

Здесь есть несколько решений.

Передача по значению поскольку это просто указатель

void receiveFromServer(sf::RenderWindow* RW) // sf::RenderWindow* instead of sf::RenderWidnow&
{ /* ... */}

std::thread receiveThread(&Network_::receiveFromServer, &network, RW); // pass by value

Передача по ссылке - совершенно бесполезно

void receiveFromServer(sf::RenderWindow*& RW) // sf::RenderWindow*& instead of sf::RenderWidnow&
{ /* ... */}

std::thread receiveThread(&Network_::receiveFromServer, &network, std::ref(RW)); // pass by reference

Передача по ссылке без изменения ваших функций

void receiveFromServer(sf::RenderWindow& RW) // no change
{ /* ... */}

std::thread receiveThread(&Network_::receiveFromServer, &network, std::ref(*RW)); // dereference and pass by reference
...