ASIO尝试引用已删除的函数

3
我有以下错误:
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();

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


看起来 sender_thread 可能正在尝试创建 s 的副本,但由于复制构造函数被删除,因此失败了。 - callyalater
@M.M,没有sender_thread构造函数,它是标准库线程! - moritzg
@callyalater 我该怎么修复这个问题?我需要提供自己的拷贝构造函数吗? - moritzg
你可能需要这样做。我不知道 Sender(const Sender&) = default; 是否可行。 - callyalater
1个回答

2

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

您需要将您的 Sender 对象使用 std::move() 移动到线程的构造函数中。


我正在调用 std::thread sender_thread{ std::move(s) }; 但它仍然给我相同的错误。 - moritzg
1
@moe2801 你可能需要在代码中加入 Sender(Sender&&) = default; - 用户自定义的析构函数会抑制隐式移动构造函数。 - M.M
不是那个问题。是析构函数的存在阻止了移动构造函数的自动生成。Asio套接字将在删除时自动关闭,因此析构函数是不必要的。 - Richard Hodges

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接