簡體   English   中英

boost asio tcp 插座 1.70 不向后兼容

[英]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::socketbasic_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM