c++ - ASIO 试图引用一个已删除的函数

标签 c++ boost-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();

我知道这是因为无法复制其中一个私有(private)成员,但我不知道如何解决它!我不想实现复制构造函数。

最佳答案

Sender 可移动但不可复制,因为 boost::asio 的套接字可移动但不可复制(参见文档)。

您需要将发送者std::move() 放入线程的构造函数中。

关于c++ - ASIO 试图引用一个已删除的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36165725/

相关文章:

c++ - 当输入大于最大值的值时,如何将 QSpinBox 的值设置为最大值?

c++ - Direct2D 加载和绘制位图

c++ - Boost库在ubuntu上产生错误

boost - c++0x lambdas,不让我作为函数 ptr 传递

c++ - 设计一个 C++ asio 流媒体服务器

c++ - 如何复制矩阵?

c++ - 为什么 64 位和 32 位系统中的 Struct 填充相同?

c++ - Boost::ASIO:优化以最小的流量,长连接,小消息,立即传递

c++ - Boost Asio 始终返回 0.0.0.0 IP

c++ - UDP数据包排列