gpt4 book ai didi

c++ - boost asio tcp socket 1.70 不向后兼容

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:37:48 27 4
gpt4 key购买 nike

我正在使用 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)’

但是定义了strand从 1.69 到 1.70 变化不大。所以这不应该是这个错误背后的问题。

boost::asio::ip::tcp::socketbasic_stream_socket<tcp> 的类型定义默认 executor .这样executor不可转换为 boost::asio::io_context::executor_typestrand需要。

所以不要使用普通的 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,因为我没有安装旧的 bo​​ost。那么这种改变可以吗?

这是正确的解决方案吗?或者我应该乘坐 tcp::socket的执行人来构建链?

最佳答案

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

关于c++ - boost asio tcp socket 1.70 不向后兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58453017/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com