我正在为我的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::socket
是basic_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
的执行者来构建绞线?
答案 0 :(得分:0)
Boost.Asio引入了重大变化。现在,执行程序是每个I / O对象的模板参数。默认类型为executor
,它是多态包装。您可以从类型化的执行程序转换为多态包装,但不能以其他方式(导致编译错误的原因)转换。您的修复程序是正确的,但是如果您希望在早期版本的Boost.Asio上进行编译,则可能需要一些#ifdef。