我正在使用 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::socket
是basic_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?
boost::asio::strand<boost::asio::executor>
的绞线,并将套接字保留为默认执行器类型来进行反转。 - Unl1ght