C++ boost asio tcp套接字1.70不向后兼容
我正在为我的http服务器使用C++ boost asio tcp套接字1.70不向后兼容,c++,sockets,boost,version,boost-beast,C++,Sockets,Boost,Version,Boost Beast,我正在为我的http服务器使用boostbeast。我根据BoostBeast文档(可能是1.66版)中提供的示例开始编写服务器。现在在Boost1.70之后,我遇到了编译问题。即使是1.69,一切都很顺利。问题出在我的课程中 template <typename RouterT> class session{ boost::asio::strand<boost::asio::io_context::executor_type> _strand; boos
boostbeast
。我根据BoostBeast文档(可能是1.66版)中提供的示例开始编写服务器。现在在Boost1.70之后,我遇到了编译问题。即使是1.69,一切都很顺利。问题出在我的课程中
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){
}
};
我不确定的是,这个修改是否适用于旧版本的boost<1.70,因为我没有旧版本的boost安装。这样的改变行吗
这是正确的解决方案吗?或者我应该使用tcp::socket
的执行器来构建串?Boost.Asio引入了一个突破性的变化。执行器现在是每个I/O对象的模板参数。默认类型是executor
,它是多态包装器。您可以从类型化执行器转换为多态包装器,但不能以其他方式(编译错误的原因)转换。您的修复是正确的,但是如果您希望在较旧版本的Boost.Asio上编译它,可能需要一些ifdef。我想指出,您的解决方案可以通过声明类型为Boost::Asio::strand
的串并将套接字保留为默认执行器类型来反转。
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)’
typedef boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::io_context::executor_type> socket_type;