首页 > 解决方案 > 构造函数导致“使用已删除函数”错误

问题描述

我正在尝试通过调用自定义构造函数来初始化结构内部的变量

这适用于使用 boost asio 与服务器通信的 https 项目。基本上我想用带参数的结构初始化一个 IO 上下文。当我添加... : stream(ioc,ctx)

这是我的结构

struct HTTPSQueryStruct
 {

   ssl::stream<tcp::socket> stream;

   HTTPSQueryStruct(boost::asio::io_context& ioc, ssl::context& ctx) : stream(ioc,ctx)
   {
   }

 };

这就是我所说的

    boost::asio::io_context ioc;
    ssl::context ctx{ssl::context::sslv23_client};
    ctx.set_verify_mode(ssl::verify_peer); /* Set to verify host's ssl */
    ctx.set_default_verify_paths();        /* Load CA certificates */

    HTTPSQueryStruct query = HTTPSQueryStruct(ioc, ctx);

这是我得到的错误

error: use of deleted function ‘HttpsCom::HTTPSQueryStruct::HTTPSQueryStruct(HttpsCom::HTTPSQueryStruct&&)’
     HTTPSQueryStruct query = HTTPSQueryStruct(ioc, ctx);
note: ‘HttpsCom::HTTPSQueryStruct::HTTPSQueryStruct(HttpsCom::HTTPSQueryStruct&&)’ is implicitly deleted because the default definition would be ill-formed:
   struct HTTPSQueryStruct
error: use of deleted function ‘boost::asio::ssl::stream<boost::asio::basic_stream_socket<boost::asio::ip::tcp> >::stream(const boost::asio::ssl::stream<boost::asio::basic_stream_socket<boost::asio::ip::tcp> >&)’
In file included from class/HttpsCom.h:10:0,
                 from class/HttpsCom.cpp:1:
/usr/local/include/boost/asio/ssl/stream.hpp:64:7: note: ‘boost::asio::ssl::stream<boost::asio::basic_stream_socket<boost::asio::ip::tcp> >::stream(const boost::asio::ssl::stream<boost::asio::basic_stream_socket<boost::asio::ip::tcp> >&)’ is implicitly deleted because the default definition would be ill-formed:

标签: c++booststructconstructorboost-asio

解决方案


原因是 assl::stream<tcp::socket>不能被复制,而你有一个成员。
(它不能被复制是巨大的use of deleted function ‘boost::asio::ssl::stream<...线试图说的,用太多的话来说。)

直接初始化而不是复制

HTTPSQueryStruct query(ioc, ctx);

您还可以添加一个移动构造函数(以后可能需要一个)

HTTPSQueryStruct(HTTPSQueryStruct&& other) 
   : stream(std::move(other.stream))
{
}

但是复制初始化只会增加噪音,我会坚持直接初始化。


推荐阅读