c++ - 将 boost 套接字放入 std::map

标签 c++ c++11 boost

我原以为这会很简单,但我一定遗漏了一些关键的东西,因此错误 =O。 我在源文件中收到“使用已删除函数”错误。

无论如何,我知道我的头文件已正确连接,因为它已在整个源文件中正确调用,除了这一行之外,源代码片段是唯一需要评估的地方。

header 源代码

using boost::asio::ip::tcp;
tcp::acceptor mAcceptor;
std::map<std::string, tcp::socket> mSockets;

源文件代码

tcp::socket socket(ioService);
mAcceptor.accept(socket);
std::string myKey = "Socket"; // Didn't add actual key string creation
mSockets[myKey] = socket;

错误

错误:使用删除函数'boost::asio::basic_stream_socket& boost::asio::basic_stream_socket::operator{const boost::asio::basic_stream_socket&)' mSockets[myKey] = 套接字;

接着说: 被隐式声明为已删除,因为“boost::asio::basic_stream_socket”声明了移动构造函数或移动赋值运算符类 basic_stream_socket。

更新

@Radosław Cybulski 建议尝试 std::move(socket) ,这消除了很大一部分错误,但现在结果是。

错误#2

'boost::asio::basic_stream_socket::basic_stream_socket()' second(std::forward<_Args2>(std::get<_Indexes2>(_tuple2))...)

最佳答案

尝试:

mSockets.insert({ myKey, std::move(socket) });

复制操作符被删除,因为没有好的方法来复制套接字。我的意思是,你连接到某个东西,然后复制,现在怎么办?您可以发送两份拷贝,只发送一份(哪一份?),还有其他的吗?所以它被删除了,如果你想传递它,使用移动构造函数/赋值和 std::move

编辑:由于空构造函数也被删除,您不能使用mSockets[key] = ...。所以我们必须依赖于insert/emplace。为什么? map 上的 operator[] 要求存在值类型的默认构造函数。我不知道为什么,但就是这样。

关于c++ - 将 boost 套接字放入 std::map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56634640/

相关文章:

c++ - 无锁原子循环队列无法正常工作

c++ - 即使模板函数在任何地方都没有调用,static_assert 也无法编译

c++ - 自定义条件语句?这可能吗?

c++ - C++中的线程控制台应用程序

c++ - 允许成员函数使用左值和右值引用限定符的目的是什么?

c++ - 什么是 C++11 标准中的消费操作?

c++ - date_time_period boost::locale::period::first_day_of_week(int v) 示例

c++ - 振奋 spirit : What type names should be used for the built in terminals?

c++ - 比较日期 C++(使用 boost )

c++ - C++ 中的命名空间名称