【问题标题】:compilation error when creating a thread with a member function with ref argument使用带有 ref 参数的成员函数创建线程时出现编译错误
【发布时间】:2020-05-21 10:38:46
【问题描述】:

我正在尝试做一个 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*t。

有人可以帮帮我吗?谢谢:)

【问题讨论】:

  • 请提供一个最小的例子。您不需要整个 Network 类,它会增加噪音。
  • Network_::receiveFromServer 需要 sf::RenderWindow &amp; 类型的 arg,但您实际上传递了 sf::RenderWindow *&amp;。错字?
  • 如果传递一个指针,为什么要传递对该指针的引用?只需按值传递即可。
  • @G.M.谢谢我发现错误是我的错,我不得不这样做:std::thread receiveThread(&Network_::receiveFromServer, &network, std::ref(*RW));这是一个 2 小时卡住了这个;(谢谢大家有一个美好的一天
  • @Kalicliq 下一次,这是一个最小可重现示例的样子:wandbox.org/permlink/ZcfS5xlALeDHHIlb

标签: c++ multithreading sfml


【解决方案1】:

您的receiveFromServer 函数需要引用sf::RenderWindow,但您传递的是sf::RenderWindow*&amp;

这里有几种解决方案。

按值传递,因为它只是一个指针

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

【讨论】:

  • 谢谢我刚刚发现我没有把 * 放在 std::ref(RW) 上,这是我的错,谢谢你的回答 :)
猜你喜欢
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-03
  • 2019-06-16
  • 2022-10-13
  • 2012-10-19
相关资源
最近更新 更多