2016-03-22 4 views
3

У меня есть следующее сообщение об ошибке:ASIO Попытка ссылаться на удаленную функцию

Error C2280 'Sender::Sender(const Sender &)': attempting to reference a deleted function 

Это мой код:

#pragma once 

#include <iostream> 
#include <string> 
#include "asio.hpp" 

using namespace asio; 

class Sender 
{ 
    public: 
     Sender(io_service& io_service, 
       const std::string& host, 
       const std::string& port) : 
        io_service_(io_service), 
        socket_(io_service, ip::udp::endpoint(ip::udp::v4(), 0)) 
     { 
      ip::udp::resolver resolver(io_service_); 
      ip::udp::resolver::query query(ip::udp::v4(), host, port); 
      ip::udp::resolver::iterator iter = resolver.resolve(query); 
      endpoint_ = *iter; 
     }; 

     ~Sender() 
     { 
      socket_.close(); 
     }; 

     void operator()() 
     { 
      std::string msg = ""; 
      for (;;) 
      { 
       std::cout << "Message: "; 
       std::cin >> msg; 
       std::cout << "The value you entered is " << msg << std::endl; 
      } 
     } 

    private: 
     io_service& io_service_; 
     ip::udp::socket socket_; 
     ip::udp::endpoint endpoint_; 

}; 

И я звоню это так:

io_service io_service; 

Sender s{ io_service, "localhost", "1337" }; 
std::thread sender_thread{ s };  
sender_thread.join(); 

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

+0

Похоже, что 'sender_thread' может пытаться создать копию' s', но при удалении конструктора копии он терпит неудачу. – callyalater

+0

@ M.M нет конструктора 'sender_thread', это std lib thread! – moritzg

+0

@callyalater Как это исправить? Должен ли я предоставить свой собственный конструктор копирования? – moritzg

ответ

2

Sender подвижный, но не подлежащий копированию, поскольку гнездо boost::asio является подвижным, но не копируемым (см. Документацию).

Вам понадобится std::move() ваш отправитель в конструкторе потока.

+0

Я вызываю 'std :: thread sender_thread {std :: move (s)};' но это дает мне ту же ошибку. – moritzg

+1

@ moe2801 вам может потребоваться поставить 'Sender (Sender &&) = default;' in-user-defined destructor подавляет неявный конструктор перемещения –

+0

Это не так. Это присутствие деструктора, предотвращающего автоматическое создание конструктора перемещения. Сокет Asio автоматически закрывается при удалении, поэтому деструктор не нужен –

Смежные вопросы