Boost Asio TCP Socket 1.70 不向后兼容。

4

我正在使用 boost-beast 来构建我的 HTTP 服务器。我根据 boost beast 文档中提供的示例(可能是版本 1.66)开始编写服务器。但是在 boost 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)’

然而,从1.69到1.70版本,strand的定义并没有改变太多,所以这不应该是错误背后的问题。 boost::asio::ip::tcp::socketbasic_stream_socket<tcp>的typedef,并带有默认的executor。 所以executor无法转换为strand所需的boost::asio::io_context::executor_type
因此,我现在使用的是不带默认执行器的 boost::asio::basic_stream_socket<tcp, Strand>
typedef boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::io_context::executor_type> socket_type;

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

这是正确的解决方案吗?还是我应该使用 tcp::socket 的执行程序来构建strand?


1
我想指出你的解决方案可以通过声明一个类型为boost::asio::strand<boost::asio::executor>的绞线,并将套接字保留为默认执行器类型来进行反转。 - Unl1ght
1个回答

2
Boost.Asio引入了一个重大变更。现在,每个I/O对象的Executor都是一个模板参数。默认类型是executor,它是多态包装器。您可以从有类型的Executor转换为多态包装器,但反过来不行(这是编译错误的原因)。您的修复方法是正确的,但如果您想在旧版本的Boost.Asio上编译它,则可能需要一些#ifdef。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接