[英]boost asio tcp socket 1.70 not backward compatible
我正在為我的 http 服務器使用boost-beast
。 我開始根據 boost beast 文檔(可能是 1.66 版)上提供的示例編寫服務器。 現在在 boost 1.70 之后我遇到了編譯問題。 即使使用 1.69,一切都運行良好。 問題出在我的session
class 內部。
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
不能轉換為strand
所需的boost::asio::io_context::executor_type
。
因此,我現在使用的不是普通的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
的執行器來構建鏈?
Boost.Asio 引入了一個突破性的變化。 Executor 現在是每個 I/O object 的模板參數。 默認類型是executor
,它是多態包裝器。 您可以從類型化執行器轉換為多態包裝器,但不能以其他方式轉換(編譯錯誤的原因)。 您的修復是正確的,但如果您希望它在舊版本的 Boost.Asio 上編譯,它可能需要一些 #ifdef。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.