Помещение буст-сокета в std :: map - PullRequest
3 голосов
/ 17 июня 2019

Я думал, что это будет просто, но я, должно быть, упускаю что-то важное, поэтому ошибка = O. Я получаю сообщение об ошибке «использование удаленной функции» внутри моего исходного файла.

Во всяком случае, я знаю, что мой заголовочный файл правильно подключен, поскольку он правильно вызывался во всем исходном файле, кроме этой строки, и фрагмент исходного кода - единственное место, которое должно требовать оценки.

Исходный код заголовка

using boost::asio::ip::tcp;
tcp::acceptor mAcceptor;
std::map<std::string, tcp::socket> mSockets;

Исходный код файла

tcp::socket socket(ioService);
mAcceptor.accept(socket);
std::string myKey = "Socket"; // Didn't add actual key string creation
mSockets[myKey] = socket;

Error

ошибка: использование функции удаления 'boost :: asio :: basic_stream_socket & boost :: asio :: basic_stream_socket :: operator {const boost :: asio :: basic_stream_socket &)' mSockets [myKey] = сокет;

Продолжает говорить: Неявно объявлено как удаленное, потому что 'boost :: asio :: basic_stream_socket' объявляет конструктор перемещения или класс оператора присваивания перемещения basic_stream_socket.

Update

@ Radosław Cybulski предложил попробовать std :: move (socket), и это устранило большую часть ошибки, но теперь это приводит к.

Ошибка № 2

boost :: asio :: basic_stream_socket :: basic_stream_socket () 'second (std :: forward <_Args2> (std :: get <_Indexes2> (_ tuple2)) ...)

Ответы [ 3 ]

4 голосов
/ 17 июня 2019

Попробуйте:

mSockets.insert({ myKey, std::move(socket) });

Оператор копирования удален, поскольку нет хорошего способа копирования сокета.Я имею в виду, вы подключаетесь к чему-то, затем копируете и что теперь?Вы можете отправить на обе копии только одну (какую?), Что-нибудь еще?Поэтому он удален, и если вы хотите передать его, используйте конструктор перемещения / присваивания и std::move.

РЕДАКТИРОВАТЬ: поскольку пустой конструктор также удален, вы не можете использовать mSockets[key] = ....Поэтому мы должны полагаться на insert / emplace.Зачем?operator[] на карте требует наличия конструктора по умолчанию типа значения.Я понятия не имею, почему, но вот оно.

3 голосов
/ 17 июня 2019

Нельзя использовать map с boost::asio::ip::tcp::socket в качестве значения, потому что map требует, чтобы его значение было конструируемым по умолчанию (например, созданный по умолчанию экземпляр создается при вызове map::operator[]), asio::ip::tcp::socket не выполняетсяэто потому, что его ctor требует, по крайней мере, принять io_context объект в качестве аргумента.

Используйте shared_ptr или unique_ptr в качестве значения карты.

0 голосов
/ 17 июня 2019

Сокет не может быть создан по умолчанию, и используемый вами оператор требует, чтобы он был именно таким (когда используется распределитель по умолчанию).

T & std :: map :: operator [] (const Key & key) :

[...] value_type должно быть EmplaceConstructible из
std::piecewise_construct, std::forward_as_tuple(key), std::tuple<>().Когда используется распределитель по умолчанию, это означает, что key_type должно быть CopyConstructible , а mapped_type должно быть DefaultConstructible .

Однако вы можете использовать emplace() и переместить сокет в std::pair<std::string, tcp::socket>, который создается emplace:

auto [it, inserted] = mSockets.emplace(myKey, std::move(socket));

Это будет move-construct сокетиспользуя конструктор tcp::socket(tcp::socket&&) вместо tcp::socket() (которого, как вы заметили, не существует).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...