LittleBuster
@LittleBuster

Как забиндить classmember handler для boost::asio?

При компиляции возникает ошибка если я в аргументе session использую tcp::socket если использую чтонить типа int или shred_ptr всё компилится. Как правильно забиндить?

#include <thread>
#include <memory>
#include <iostream>

#include <boost/bind.hpp>
#include <boost/asio.hpp>

using boost::asio::ip::tcp;
using namespace std;


class Server
{
private:
    boost::asio::io_service io_service;

public:
    void session(tcp::socket sock)
    {
        cout << "New connection..." << endl;
    }

    void start(unsigned port)
    {
        tcp::acceptor a(io_service, tcp::endpoint(tcp::v4(), port));
        cout << "Server started..." << endl;
        for (;;) {
            tcp::socket sock(io_service);
            a.accept(sock);
            thread(boost::bind(&Server::session, this, move(sock))).detach(); //выдаёт ошибку чёто типа using deleted function
        }
    }
};

int main()
{
    auto server = make_shared<Server>();
    server->start(5000);
    return 0;
}
  • Вопрос задан
  • 152 просмотра
Решения вопроса 1
Nipheris
@Nipheris Куратор тега C++
99%, что удаленная функция - это конструктор копирования.
По смыслу объекта сокета можно догадаться, что копировать его не стоит (т.к. так или иначе он представляет собой обертку над системным ресурсом). Раз его копировать не стоит, используйте указатель на сокет вместо самого сокета. Например, shared_ptr, вот как тут советуют: stackoverflow.com/questions/5425666/passing-around... .

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

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы