boost asio tcp socket 1.70不向下兼容

时间:2019-10-18 14:35:33

标签: c++ sockets boost version boost-beast

我正在为我的http服务器使用boost-beast。我开始根据增强野兽文档(可能是1.66版)上提供的示例来编写服务器。现在,在提升1.70之后,我遇到了编译问题。即使在1.69,一切都可以正常工作。问题出在我的session类中。

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时出现以下错误

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::socketbasic_stream_socket<tcp>的typedef,默认值为executor。因此executor不能转换为boost::asio::io_context::executor_type所需的strand

因此,我现在不再使用普通的boost::asio::ip::tcp::socket

typedef boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::io_context::executor_type> socket_type;

我不确定该修改是否适用于旧版本的boost <1.70,因为我没有旧的boost安装。那改变好吗?

这是正确的解决方案吗?还是应该让tcp::socket的执行者来构建绞线?

1 个答案:

答案 0 :(得分:0)

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