2016-03-22 21 views
3

başvuru çalışılıyor aşağıdaki hatayı vardır:ASIO Silinen işlevi

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

Bu benim kodudur:

#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_; 

}; 

Ve bu şekilde aradığım:

io_service io_service; 

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

Bunun, özel üyelerden birinin kopyalanamayacağını biliyorum, ancak nasıl düzeltileceğini anlayamıyorum! Bir kopya kurucuyu uygulamak istemiyorum.

+0

's' kopyasının bir kopyasını oluşturmaya çalışan sender_thread gibi görünüyor, ancak kopya kurucusunun silinmesiyle başarısız oluyor. – callyalater

+0

@ M.M, "sender_thread" yapıcısı yok, std lib iş parçacığı! – moritzg

+0

@callyalater Bunu nasıl düzeltirim? Kendi kopya kurucamı vermem gerekiyor mu? – moritzg

cevap

2

Sender taşınabilir ancak kopyalanamaz, çünkü boost::asio 's yuvası taşınabilir ancak kopyalanamaz (belgelere bakın).

Göndericinizi, iş parçacığının yapıcısına std::move() gerekir.

+0

Ben std :: thread sender_thread {std :: move (s)} 'yi arıyorum, ancak bana aynı hatayı veriyor. – moritzg

+1

@ moe2801 'Sender (Sender &&) = default; 'in-user-defined destructor' örtülü hareket kurucusunu –

+0

bastırır. Taşımanın otomatik oluşturulmasını engelleyen yıkıcının varlığı. Bir Asio soketi, otomatik olarak silme işlemini kapatır, böylece yok edici gereksizdir –