Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Boost asio库最新版本中缺少方法的替代方法_C++_Boost_Boost Asio - Fatal编程技术网

C++ Boost asio库最新版本中缺少方法的替代方法

C++ Boost asio库最新版本中缺少方法的替代方法,c++,boost,boost-asio,C++,Boost,Boost Asio,几年前,我使用Boost asio库编写了一个电子邮件客户端 有一个抽象类ICON,包含四个子类 POP3通信 POP3conS保护POP3通信 SMTPconN到平面SMTP通信 SMTPconS保护SMTP通信 图标有一个成员 boost::asio::ip::tcp::socket socket_ 和两个虚拟过程,在每个子类中定义: void SMTPconN::run() { socket_.get_io_service().run(); } void SMTPconN::reset(

几年前,我使用Boost asio库编写了一个电子邮件客户端

有一个抽象类ICON,包含四个子类

POP3通信

POP3conS保护POP3通信

SMTPconN到平面SMTP通信

SMTPconS保护SMTP通信

图标有一个成员

boost::asio::ip::tcp::socket socket_
和两个虚拟过程,在每个子类中定义:

void SMTPconN::run() { socket_.get_io_service().run(); }
void SMTPconN::reset() { socket_.get_io_service().reset(); }
该应用程序在boost_1_63_0上运行良好。但当我尝试更新以提升_1_70_0时,编译器(MS V Studio 2015)对这两种定义都有抱怨:

class "boost::asio::ssl::stream<boost::asio::ip::tcp::socket>" has no member "get_io_service".
类“boost::asio::ssl::stream”没有成员“get\u io\u service”。
因为我想对大量的代码和复杂的逻辑进行最小的更改:对于这个遗漏的方法,是否有一些解决方法?

文档状态下,您可以使用
get\u context().context()
,这将为您提供一个
io\u context
实例(它取代了boost 1.64/1.65 IIRC附近的
io_服务

网络TS兼容性 Boost.Asio现在提供了“C++网络扩展”技术规范指定的接口和功能。除了通过常用的Boost.Asio头文件进行访问外,还可以通过与TS中定义的头文件相对应的特殊头文件访问此功能。下表列出了这些头文件:

[……]

使用get_executor().context()获取关联的io_上下文

get\u io\u service()
get\u io\u context()
之前都是为了方便移植而准备的,但同时它们也被弃用和淘汰了

PS:还要看看哪一个与你的问题非常相似,但指定了一个特定的用例

这里的注释为该用例提供了明显更好的解决方案:

socket.get_io_service().post([](){ /* my custom code */ } );
变成

post(socket.executor(), [](){ /* my custom code */ } );

子类:POP3conNSMTPconN有一个成员:

boost::asio::ip::tcp::socket socket_
boost::asio::ssl::stream<boost::asio::ip::tcp::socket>  socket_;
类似地,POP3conSSMTPconS也有一个成员:

boost::asio::ip::tcp::socket socket_
boost::asio::ssl::stream<boost::asio::ip::tcp::socket>  socket_;
第一次更改:在抽象类中添加了一个新成员:

boost::asio::io_context* iocontPtr_;
在构造函数中初始化,替换对
io\u服务的旧引用

IPCON::IPCON(boost::asio::io_context* iocont_, ...) { ... }
在构造函数中,已将子类的初始化添加到该成员:

POP3conN::POP3conN(boost::asio::io_context* iocont, ....) : IPCON(iocont) { ... }
第二次更改:所有发生的

boost::asio::io_service
可以用

boost::asio::io_context
有问题的表达

void SMTPconN::run() { socket_.get_io_service().run(); }
void SMTPconN::reset() { socket_.get_io_service().reset(); }
现在显示如下:

void SMTPconN::run() { iocontPtr->run(); }
void SMTPconN::reset() { iocontPtr->reset(); }
似乎旧的
io\u服务的功能已被新的
io\u上下文所取代