chriskohlhoff / asio

Asio C++ Library
http://think-async.com/Asio
4.72k stars 1.19k forks source link

asio::connect not compatible EndpointSequence pointing to values convertible to Endpoint #1502

Open anarthal opened 5 days ago

anarthal commented 5 days ago

Version: Boost develop System: Ubuntu 22.04, clang-18, Debug, C++20

The following fails:

#include <boost/asio/connect.hpp>
#include <boost/asio/generic/stream_protocol.hpp>
#include <boost/asio/io_context.hpp>
#include <boost/asio/ip/tcp.hpp>

namespace asio = boost::asio;

int main()
{
    asio::io_context ctx;
    asio::ip::tcp::resolver resolv(ctx);
    asio::generic::stream_protocol::socket sock(ctx);

    auto eps = resolv.resolve("www.example.com", "80");
    asio::connect(sock, eps);
}

With the following error:

[build] In file included from /home/ruben/workspace/boost-root/libs/mysql/example/tutorial.cpp:3:
[build] In file included from /home/ruben/workspace/boost-root/libs/asio/include/boost/asio/generic/stream_protocol.hpp:25:
[build] /home/ruben/workspace/boost-root/libs/asio/include/boost/asio/generic/basic_endpoint.hpp:72:22: error: no member named 'data' in 'boost::asio::ip::basic_resolver_entry<boost::asio::ip::tcp>'
[build]    72 |     : impl_(endpoint.data(), endpoint.size(), endpoint.protocol().protocol())
[build]       |             ~~~~~~~~ ^
[build] /home/ruben/workspace/boost-root/libs/asio/include/boost/asio/impl/connect.hpp:246:17: note: in instantiation of function template specialization 'boost::asio::generic::basic_endpoint<boost::asio::generic::stream_protocol>::basic_endpoint<boost::asio::ip::basic_resolver_entry<boost::asio::ip::tcp>>' requested here
[build]   246 |       s.connect(*iter, ec);
[build]       |                 ^
[build] /home/ruben/workspace/boost-root/libs/asio/include/boost/asio/impl/connect.hpp:99:7: note: in instantiation of function template specialization 'boost::asio::connect<boost::asio::generic::stream_protocol, boost::asio::any_io_executor, boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>, boost::asio::detail::default_connect_condition>' requested here
[build]    99 |       connect(s, endpoints.begin(), endpoints.end(),
[build]       |       ^
[build] /home/ruben/workspace/boost-root/libs/asio/include/boost/asio/impl/connect.hpp:86:40: note: in instantiation of function template specialization 'boost::asio::connect<boost::asio::generic::stream_protocol, boost::asio::any_io_executor, boost::asio::ip::basic_resolver_results<boost::asio::ip::tcp>>' requested here
[build]    86 |   typename Protocol::endpoint result = connect(s, endpoints, ec);
[build]       |                                        ^
[build] /home/ruben/workspace/boost-root/libs/mysql/example/tutorial.cpp:17:11: note: in instantiation of function template specialization 'boost::asio::connect<boost::asio::generic::stream_protocol, boost::asio::any_io_executor, boost::asio::ip::basic_resolver_results<boost::asio::ip::tcp>>' requested here
[build]    17 |     asio::connect(sock, eps);
[build]       |           ^

From the documentation, I think this should work, as resolver entries have an operator endpoint_type. Looks like connect (and I guess async_connect) are missing a cast to the endpoint type.