boost asio tcp socket 1.70 не имеет обратной совместимости - PullRequest
2 голосов
/ 18 октября 2019

Я использую boost-beast для моего http-сервера. Я начал писать сервер на основе примера, приведенного в документации к баст-зверю (вероятно, версия 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 - это typedef, равный basic_stream_socket<tcp> со значением по умолчанию 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. Так это изменение хорошо? </p>

Это правильное решение? Или я должен был взять исполнителя tcp::socket, чтобы построить прядь?

1 Ответ

0 голосов
/ 20 октября 2019

Boost.Asio представила серьезное изменение. Executor теперь является параметром шаблона для каждого объекта ввода / вывода. Тип по умолчанию - executor, который является полиморфной оболочкой. Вы можете преобразовать типизированный исполнитель в полиморфную оболочку, но не другим способом (причиной ошибки компиляции). Ваше исправление корректно, но может потребоваться #ifdef, если вы хотите, чтобы он компилировался в более старых версиях Boost.Asio.

...