2016-03-22 10 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(); 

プライベートメンバーの1人がコピーできないためですが、修正する方法がわかりません。私はコピーコンストラクタを実装したくありません。

+0

'sender_thread'が' s'のコピーを作成しようとしているように見えますが、コピーコンストラクタを削除すると失敗します。 – callyalater

+0

@ M.M 'sender_thread'コンストラクタはありません。それはstd libスレッドです! – moritzg

+0

@callyalaterこれはどのように修正するのですか?私自身のコピーコンストラクタを提供する必要がありますか? – moritzg

答えて

2

Senderは移動可能ですがコピーできません。boost::asioのソケットは移動可能ですがコピーできません(ドキュメントを参照)。

送信者をスレッドのコンストラクタにstd::move()する必要があります。

+0

私は 'std :: thread sender_thread {std :: move(s)};}を呼び出していますが、それは私に同じエラーを与えています。 – moritzg

+1

@ moe2801 'Sender(Sender &&)= default;を入れる必要があるかもしれません。ユーザ定義のデストラクタは暗黙的な移動コンストラクタを抑制します。 –

+0

それはそうではありません。移動コンストラクタの自動生成を妨げるのはデストラクタの存在です。 Asioソケットは削除時に自動的にクローズし、デストラクタは不要です –

関連する問題