listener.accept 将 unique_ptr 传递给 sf::TcpSocket 时出错

listener.accept gives error when passed a unique_ptr to sf::TcpSocket

我一直在尝试为我一直在开发的游戏制作服务器。 它的问题是,如果有人断开连接,最后连接的人也会断开连接,因为我制作服务器的方式。

我曾在 sfml 论坛上询问如何解决此问题,并收到回复说不要使用 std::vector<sf::TcpSocket> clients 使用 std::vector<std::unique_ptr<sf::TcpSocket>> clients.

在更改所有内容以适应此更改后,我 运行 遇到了此代码的问题:

while (listener.accept(clients[numClients + 1].get()) == sf::Socket::Done)

据我所知,这应该可行,但我以某种方式搞砸了它并得到了这个错误:

initial value of reference to non-const must be an ivalue

这是一个只有问题代码的片段:

#include <iostream>
#include <vector>
#include <memory>
#include <SFML\Network.hpp>

int main()
{
    const int maxClients = 100;
    int numClients = 0;
    std::vector<std::unique_ptr<sf::TcpSocket>> clients(maxClients);

    sf::TcpListener listener;

    while (listener.accept(clients[numClients + 1].get()) == sf::Socket::Done)
    {
        numClients++;
        std::cout << "new guy connected" << std::endl;
    }

    return 0;
}

我对 sfml 和 c++ 很陌生(只有大约一年的经验),所以请写下像我这样的人可以理解的回复:)

TcpListener.accept-方法期望参数作为引用,但您将其作为指针传递(请注意,std::unique_ptr::get returns 是一个指针)。您需要取消引用唯一指针:

listener.accept(*(clients.at(numClients+1)))

您还应该使用 std::vector::at 方法来访问成员。