首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost asio tcp套接字1.70不向后兼容

boost asio tcp套接字1.70不向后兼容
EN

Stack Overflow用户
提问于 2019-10-18 22:35:34
回答 1查看 1.2K关注 0票数 4

我正在为我的http服务器使用boost-beast。我开始基于boost beast文档(可能是1.66版)中提供的示例编写服务器。现在,在boost 1.70之后,我遇到了编译问题。即使是在1.69版本中,一切都工作得很好。问题出在我的session类中。

代码语言:javascript
复制
template <typename RouterT>
class session{
    boost::asio::strand<boost::asio::io_context::executor_type> _strand;
    boost::asio::ip::tcp::socket _socket
    // ...
    explicit session(RouterT& router, boost::asio::ip::tcp::socket socket, std::shared_ptr<std::string const> const& doc_root)
        : _router(router), 
          _socket(std::move(socket)), 
          _strand(_socket.get_executor()), 
          _doc_root(doc_root), 
          _lambda(*this){

          }
};

当我升级到1.71时,我得到了以下错误

代码语言:javascript
复制
error: no matching function for call to ‘boost::asio::strand<boost::asio::io_context::executor_type>::strand(boost::asio::basic_socket<boost::asio::ip::tcp, boost::asio::executor>::executor_type)’

然而,strand的定义从1.69到1.70并没有太大的变化。所以这不应该是这个错误背后的问题。

boost::asio::ip::tcp::socket是带有默认executorbasic_stream_socket<tcp>的类型定义。因此executor不能转换为strand所需的boost::asio::io_context::executor_type

所以我现在使用的不是普通的boost::asio::ip::tcp::socket,而是

代码语言:javascript
复制
typedef boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::io_context::executor_type> socket_type;

我不确定的是,这个修改是否适用于旧版本的boost < 1.70,因为我没有安装旧的boost。这样的改变可以吗?

这是正确的解决方案吗?或者我应该带着tcp::socket的执行者去建造那条链?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-20 20:37:14

Boost.Asio引入了一个突破性的变化。Executor现在是每个I/O对象的模板参数。默认类型是executor,它是多态包装器。您可以从类型化的执行器转换为多态包装器,但不能以另一种方式转换(这是导致编译错误的原因)。您的修复是正确的,但如果您希望它在旧版本的Boost.Asio上编译,则可能需要一些#ifdef。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58453017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档