2016-03-22 6 views
3

I zu verweisen habe folgende Fehler:ASIO Den Versuch, eine gelöschte Funktion

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

Dies ist mein Code:

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

}; 

Und ich bin es so nennen:

io_service io_service; 

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

Ich weiß, dass es ist, weil eines der privaten Mitglieder nicht kopiert werden kann, aber ich kann nicht herausfinden, wie man es repariert! Ich möchte keinen Kopierkonstruktor implementieren.

+0

Es sieht so aus, als würde der 'sender_thread' versuchen, eine Kopie von' s' zu erstellen, aber mit dem Kopierkonstruktor, der gelöscht wird, schlägt er fehl. – callyalater

+0

@ M.M gibt es keinen 'sender_thread'-Konstruktor, es ist der Standard-lib-Thread! – moritzg

+0

@callyalater Wie behebe ich das? Muss ich meinen eigenen Kopierkonstruktor zur Verfügung stellen? – moritzg

Antwort

2

Sender ist beweglich, aber nicht kopierbar, da boost::asio der Socket zwar beweglich aber nicht kopierbar ist (siehe Dokumentation).

Sie müssen std::move() Ihren Absender in den Konstruktor des Threads.

+0

Ich rufe 'std :: thread sender_thread {std :: move (s)};' auf, aber es gibt mir denselben Fehler. – moritzg

+1

@ moe2801 Sie müssen möglicherweise 'Sender (Sender &&) = default;' in - user-defined destructor unterdrückt implizite Bewegung Konstruktor –

+0

Es ist nicht das. Das Vorhandensein des Destruktors verhindert die automatische Generierung des Move-Konstruktors. Ein Asio-Socket wird beim Löschen automatisch geschlossen, so dass der Destruktor nicht benötigt wird –