Я использую 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
, чтобы построить прядь?