chriskohlhoff / asio

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

Boost 1.79.0: no matching function for call to ‘executor_work_guard(boost::asio::io_context::executor_type&)’ #1074

Open tusooa opened 2 years ago

tusooa commented 2 years ago

Environment:

c++ (Gentoo 11.3.0 p4) 11.3.0

Output:

[87/124] Building CXX object src/job/CMakeFiles/kazvjob.dir/cprjobhandler.cpp.o
FAILED: src/job/CMakeFiles/kazvjob.dir/cprjobhandler.cpp.o
/usr/bin/c++ -DBOOST_SERIALIZATION_DYN_LINK -DBOOST_SERIALIZATION_NO_LIB -DJSON_DIAGNOSTICS=0 -DJSON_USE_IMPLICIT_CONVERSIONS=1 -Dkazvjob_EXPORTS -I/home/tusooa/Code/libkazv/src/base -I/home/tusooa/Code/libkazv/build/src/base -isystem /home/tusooa/Install/libkazv/include/cpr -isystem /home/tusooa/Install/libkazv/include/cpr/.. -Wall -Wextra -g -fPIC -pthread -std=gnu++17 -MD -MT src/job/CMakeFiles/kazvjob.dir/cprjobhandler.cpp.o -MF src/job/CMakeFiles/kazvjob.dir/cprjobhandler.cpp.o.d -o src/job/CMakeFiles/kazvjob.dir/cprjobhandler.cpp.o -c /home/tusooa/Code/libkazv/src/job/cprjobhandler.cpp
/home/tusooa/Code/libkazv/src/job/cprjobhandler.cpp: In member function ‘virtual void Kazv::CprJobHandler::async(std::function<void()>)’:
/home/tusooa/Code/libkazv/src/job/cprjobhandler.cpp:269:96: error: class template argument deduction failed:
  269 |         std::thread([func=std::move(func), guard=boost::asio::executor_work_guard(m_d->executor)]() {
      |                                                                                                ^
/home/tusooa/Code/libkazv/src/job/cprjobhandler.cpp:269:96: error: no matching function for call to ‘executor_work_guard(boost::asio::io_context::executor_type&)’
In file included from /usr/include/boost/asio/detail/handler_work.hpp:27,
                 from /usr/include/boost/asio/detail/completion_handler.hpp:21,
                 from /usr/include/boost/asio/impl/io_context.hpp:18,
                 from /usr/include/boost/asio/io_context.hpp:1530,
                 from /usr/include/boost/asio/detail/io_object_impl.hpp:23,
                 from /usr/include/boost/asio/basic_socket.hpp:22,
                 from /usr/include/boost/asio/basic_datagram_socket.hpp:20,
                 from /usr/include/boost/asio.hpp:26,
                 from /home/tusooa/Code/libkazv/src/base/asio-std-file-handler.hpp:13,
                 from /home/tusooa/Code/libkazv/src/job/cprjobhandler.cpp:18:
/usr/include/boost/asio/executor_work_guard.hpp:34:7: note: candidate: ‘template<class Executor, class, class> executor_work_guard()-> boost::asio::executor_work_guard<Executor, <template-parameter-1-2>, <template-parameter-1-3> >’
   34 | class executor_work_guard;
      |       ^~~~~~~~~~~~~~~~~~~
/usr/include/boost/asio/executor_work_guard.hpp:34:7: note:   template argument deduction/substitution failed:
/home/tusooa/Code/libkazv/src/job/cprjobhandler.cpp:269:96: note:   candidate expects 0 arguments, 1 provided
  269 |         std::thread([func=std::move(func), guard=boost::asio::executor_work_guard(m_d->executor)]() {
      |                                                                                                ^
In file included from /usr/include/boost/asio/detail/handler_work.hpp:27,
                 from /usr/include/boost/asio/detail/completion_handler.hpp:21,
                 from /usr/include/boost/asio/impl/io_context.hpp:18,
                 from /usr/include/boost/asio/io_context.hpp:1530,
                 from /usr/include/boost/asio/detail/io_object_impl.hpp:23,
                 from /usr/include/boost/asio/basic_socket.hpp:22,
                 from /usr/include/boost/asio/basic_datagram_socket.hpp:20,
                 from /usr/include/boost/asio.hpp:26,
                 from /home/tusooa/Code/libkazv/src/base/asio-std-file-handler.hpp:13,
                 from /home/tusooa/Code/libkazv/src/job/cprjobhandler.cpp:18:
/usr/include/boost/asio/executor_work_guard.hpp:34:7: note: candidate: ‘template<class Executor, class, class> executor_work_guard(boost::asio::executor_work_guard<Executor, <template-parameter-1-2>, <template-parameter-1-3> >)-> boost::asio::executor_work_guard<Executor, <template-parameter-1-2>, <template-parameter-1-3> >’
   34 | class executor_work_guard;
      |       ^~~~~~~~~~~~~~~~~~~
/usr/include/boost/asio/executor_work_guard.hpp:34:7: note:   template argument deduction/substitution failed:
/home/tusooa/Code/libkazv/src/job/cprjobhandler.cpp:269:96: note:   ‘boost::asio::io_context::basic_executor_type<std::allocator<void>, 0>’ is not derived from ‘boost::asio::executor_work_guard<Executor, <template-parameter-1-2>, <template-parameter-1-3> >’
  269 |         std::thread([func=std::move(func), guard=boost::asio::executor_work_guard(m_d->executor)]() {
      |                                                 

Source: https://lily-is.land/kazv/libkazv/-/blob/servant/src/job/cprjobhandler.cpp#L269 https://lily-is.land/kazv/libkazv/-/blob/servant/src/job/cprjobhandler.cpp#L105 : boost::asio::io_context::executor_type executor;

tusooa commented 2 years ago

The minimal source to reproduce this:

#include <boost/asio.hpp>

int main()
{
    boost::asio::io_context io;
    auto g = boost::asio::executor_work_guard(io.get_executor());

}

Result:

] c++ asio-test.cpp
asio-test.cpp: In function ‘int main()’:
asio-test.cpp:6:64: error: class template argument deduction failed:
    6 |     auto g = boost::asio::executor_work_guard(io.get_executor());
      |                                                                ^
asio-test.cpp:6:64: error: no matching function for call to ‘executor_work_guard(boost::asio::io_context::executor_type)’
In file included from /usr/include/boost/asio/detail/handler_work.hpp:27,
                 from /usr/include/boost/asio/detail/completion_handler.hpp:21,
                 from /usr/include/boost/asio/impl/io_context.hpp:18,
                 from /usr/include/boost/asio/io_context.hpp:1530,
                 from /usr/include/boost/asio/detail/io_object_impl.hpp:23,
                 from /usr/include/boost/asio/basic_socket.hpp:22,
                 from /usr/include/boost/asio/basic_datagram_socket.hpp:20,
                 from /usr/include/boost/asio.hpp:26,
                 from asio-test.cpp:1:
/usr/include/boost/asio/executor_work_guard.hpp:34:7: note: candidate: ‘template<class Executor, class, class> executor_work_guard()-> boost::asio::executor_work_guard<Executor, <template-parameter-1-2>, <template-parameter-1-3> >’
   34 | class executor_work_guard;
      |       ^~~~~~~~~~~~~~~~~~~
/usr/include/boost/asio/executor_work_guard.hpp:34:7: note:   template argument deduction/substitution failed:
asio-test.cpp:6:64: note:   candidate expects 0 arguments, 1 provided
    6 |     auto g = boost::asio::executor_work_guard(io.get_executor());
      |                                                                ^
In file included from /usr/include/boost/asio/detail/handler_work.hpp:27,
                 from /usr/include/boost/asio/detail/completion_handler.hpp:21,
                 from /usr/include/boost/asio/impl/io_context.hpp:18,
                 from /usr/include/boost/asio/io_context.hpp:1530,
                 from /usr/include/boost/asio/detail/io_object_impl.hpp:23,
                 from /usr/include/boost/asio/basic_socket.hpp:22,
                 from /usr/include/boost/asio/basic_datagram_socket.hpp:20,
                 from /usr/include/boost/asio.hpp:26,
                 from asio-test.cpp:1:
/usr/include/boost/asio/executor_work_guard.hpp:34:7: note: candidate: ‘template<class Executor, class, class> executor_work_guard(boost::asio::executor_work_guard<Executor, <template-parameter-1-2>, <template-parameter-1-3> >)-> boost::asio::executor_work_guard<Executor, <template-parameter-1-2>, <template-parameter-1-3> >’
   34 | class executor_work_guard;
      |       ^~~~~~~~~~~~~~~~~~~
/usr/include/boost/asio/executor_work_guard.hpp:34:7: note:   template argument deduction/substitution failed:
asio-test.cpp:6:64: note:   ‘boost::asio::io_context::basic_executor_type<std::allocator<void>, 0>’ is not derived from ‘boost::asio::executor_work_guard<Executor, <template-parameter-1-2>, <template-parameter-1-3> >’
    6 |     auto g = boost::asio::executor_work_guard(io.get_executor());
      |                                                                
tusooa commented 2 years ago

Changing to auto g = boost::asio::make_work_guard(io.get_executor()); will not result in a compiler error. But why does the original method fail?