AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-12018554

Qwe Qwe's questions

Martin Hope
Qwe Qwe
Asked: 2025-04-19 21:21:02 +0800 CST

Criando uma função utilitária de string única com comportamento duplo em C++

  • 10

Estou desenvolvendo uma classe utilitária de strings que fornece diversas funções de manipulação de strings. Quero que os usuários tenham duas opções ao usar essas funções:

  • Crie e retorne uma nova string com a manipulação aplicada
  • Atualizar a sequência de caracteres existente no local

Atualmente, implementei isso com sobrecarga de função:

struct String final {
    static std::string toUpperCase(const std::string& str) {
        std::string result = str;
        std::transform(result.begin(), result.end(), result.begin(), 
                       [](unsigned char c) { return std::toupper(c); });
        return result;
    }
    
    static void toUpperCase(std::string& str) {
        std::transform(str.begin(), str.end(), str.begin(), 
                       [](unsigned char c) { return std::toupper(c); });
    }
};

int main() {
std::string str {"helloworld"};
std::string test = String::toUpperCase(str);
String::toUpperCase(str);
}

Minha pergunta: É possível combinar essas duas funções em uma única função que pode:

-> Retorna uma nova string maiúscula quando necessário
-> Modifique uma string no local quando desejado

Qual seria a abordagem C++ mais elegante e idiomática para isso? Considerei modelos e parâmetros opcionais, mas não tenho certeza de qual abordagem forneceria a API mais limpa para os usuários.

Se não for possível combinar essas duas funções em uma única função, também estou interessado em saber como eliminar a std::transform...duplicação de code( ) entre elas.

Observação: Estou ciente de que a implementação que mostrei não compilaria. Estou compartilhando-a especificamente para ilustrar a abordagem que eu estava considerando e os desafios que estou enfrentando com sobrecarga de funções e especialização de modelos.

c++
  • 1 respostas
  • 144 Views
Martin Hope
Qwe Qwe
Asked: 2024-11-22 14:28:42 +0800 CST

std::function variadic como parâmetro

  • 4

O compilador pode compilar runa função sem falhas. Mas eu não sei como chamar essa função.

#include <iostream>
#include <functional>
#include <utility>
#include <string>

template<class... Args>
void run(std::function<void(Args...)>&& f, Args&&... args) {
    f(std::forward<Args>(args)...);
}


void greet(std::string name, int times) {
    for(int i = 0; i < times; ++i) {
        std::cout << "Hello, " << name << "!\n";
    }
}

int main() {
    std::function<void(std::string, int)> func = greet;
    run<std::string, int>(greet, std::string("Bob"), 2);  // Not working
    run(func, std::string("Bob"), 2);  // Not working
    return 0;
}

O código a seguir está ok e funciona perfeitamente. Só não consegui descobrir como a função no código acima poderia ser chamada.

template<class Functor, typename... Args>
void run(Functor&& f, Args&&... args) {
    f(std::forward<Args>(args)...);
}
c++
  • 2 respostas
  • 75 Views
Martin Hope
Qwe Qwe
Asked: 2024-05-04 20:35:37 +0800 CST

Pacote de parâmetros e encaminhamento perfeito

  • 7

Acabei de escrever o seguinte código simples, mas ele não compila:

#include <iostream>
#include <string>


class Obj{
public:
    std::string name = "Name";
    std::string l_name = "LastName";
    
    template<typename P>
    Obj(P&& param): name{std::forward<P>(param)} { }
    
    friend std::ostream& operator<<(std::ostream& os, const Obj& obj);
};

std::ostream& operator<<(std::ostream& os, const Obj& obj) {
    os << obj.name << ":" << obj.l_name;
    return os;
}


void print() {
    std::cout << "}";
}

template<typename T, typename ...Args>
void print(T param, Args... args) {
    std::size_t count = sizeof...(args);
    std::cout << param;
    if ( count != 0 ) {
        std::cout << ",";
    }
    print(args...);
}

template<typename... Args>
void run(Args... args) {
    std::cout << "{";
    print(args...);
}

int main() {
    Obj obj{"obj"};
    run("1", "2", 1.3, std::string{"Some Message"}, obj);
    
    return 0;
}

Acabei de usar um pacote de parâmetros simples e um exemplo de encaminhamento perfeito, mas deu o seguinte erro:

main.cpp: In instantiation of ‘Obj::Obj(P&&) [with P = Obj&]’:
main.cpp:49:8:   required from here
main.cpp:12:21: error: no matching function for call to ‘std::__cxx11::basic_string::basic_string()’
   12 |     Obj(P&& param): name{std::forward<P>(param)} {
...

Se eu não usar o parâmetro obj na função run, o exemplo funcionará conforme o esperado.

c++
  • 2 respostas
  • 60 Views
Martin Hope
Qwe Qwe
Asked: 2023-10-03 16:43:57 +0800 CST

Arquivo de soquete Boost/Asio

  • 7

No passado, escrevi um servidor tcp simples usando a biblioteca boost e o código abaixo funcionando corretamente.

#include <cstdlib>
#include <iostream>
#include <memory>
#include <utility>
#include <boost/asio.hpp>

using boost::asio::ip::tcp;

class session
  : public std::enable_shared_from_this<session>
{
public:
  session(tcp::socket socket)
    : socket_(std::move(socket))
  {
  }

  void start()
  {
    do_read();
  }

private:
  void do_read()
  {
    auto self(shared_from_this());
    socket_.async_read_some(boost::asio::buffer(data_, max_length),
        [this, self](boost::system::error_code ec, std::size_t length)
        {
          if (!ec)
          {
            do_write(length);
          }
        });
  }

  void do_write(std::size_t length)
  {
    auto self(shared_from_this());
    boost::asio::async_write(socket_, boost::asio::buffer(data_, length),
        [this, self](boost::system::error_code ec, std::size_t /*length*/)
        {
          if (!ec)
          {
            do_read();
          }
        });
  }

  tcp::socket socket_;
  enum { max_length = 1024 };
  char data_[max_length];
};

class server
{
public:
  server(boost::asio::io_context& io_context, short port)
    : acceptor_(io_context, tcp::endpoint(tcp::v4(), port))
  {
    do_accept();
  }

private:
  void do_accept()
  {
    acceptor_.async_accept(
        [this](boost::system::error_code ec, tcp::socket socket)
        {
          if (!ec)
          {
            std::make_shared<session>(std::move(socket))->start();
          }

          do_accept();
        });
  }

  tcp::acceptor acceptor_;
};

int main(int argc, char* argv[])
{
  try
  {
    if (argc != 2)
    {
      std::cerr << "Usage: async_tcp_echo_server <port>\n";
      return 1;
    }

    boost::asio::io_context io_context;

    server s(io_context, std::atoi(argv[1]));

    io_context.run();
  }
  catch (std::exception& e)
  {
    std::cerr << "Exception: " << e.what() << "\n";
  }

  return 0;
}

Agora eu quero usar o arquivo de soquete chamado "mysocket" e usá-lo em vez de ip/port. E eu mudei apenas abaixo das linhas. Também espero que o arquivo "mysocket" seja criado automaticamente a partir da linha a seguir. Então eu não o criei manualmente.

  server(boost::asio::io_context& io_context, short port)
    : acceptor_(io_context, boost::asio::local::stream_protocol::endpoint("mysocket"))
  {
    do_accept();
  }

boost::asio::local::stream_protocol::acceptor acceptor_;

Mas eu não compilo e dá o erro abaixo. Como posso consertar isso?

main.cpp: In member function ‘void server::do_accept()’:
main.cpp:67:27: error: no matching function for call to ‘boost::asio::basic_socket_acceptor<boost::asio::local::stream_protocol>::async_accept(server::do_accept()::<lambda(boost::system::error_code, boost::asio::ip::tcp::socket)>)’
   67 |     acceptor_.async_accept(
   68 |         [this](boost::system::error_code ec, tcp::socket socket)
   69 |         {
      |         ~                  
   70 |           if (!ec)
   71 |           {
      |           ~                
   72 |             std::make_shared<session>(std::move(socket))->start();
   73 |           }
      |           ~                
   75 |           do_accept();
   76 |         });
      |         ~~                 
In file included from /usr/local/include/boost/asio.hpp:43,
                 from main.cpp:5:
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:1398:3: note: candidate: ‘template<class Protocol1, class Executor1, class AcceptToken>  requires  completion_token_for<AcceptToken, void()> auto boost::asio::basic_socket_acceptor<Protocol, Executor>::async_accept(boost::asio::basic_socket<Protocol1, Executor1>&, AcceptToken&&, typename boost::asio::constraint<std::is_convertible<Protocol, Protocol1>::value>::type) [with Protocol1 = Protocol1; Executor1 = Executor1; AcceptToken = AcceptToken; Protocol = boost::asio::local::stream_protocol; Executor = boost::asio::any_io_executor]’
 1398 |   async_accept(basic_socket<Protocol1, Executor1>& peer,
      |   ^~~~~~~~~~~~
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:1398:3: note:   template argument deduction/substitution failed:
main.cpp:67:27: note:   ‘server::do_accept()::<lambda(boost::system::error_code, boost::asio::ip::tcp::socket)>’ is not derived from ‘boost::asio::basic_socket<Protocol, Executor>’
   67 |     acceptor_.async_accept(
      |     ~~~~~~~~~~~~~~~~~~~~~~^
   68 |         [this](boost::system::error_code ec, tcp::socket socket)
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   69 |         {
      |         ~                  
   70 |           if (!ec)
      |           ~~~~~~~~         
   71 |           {
      |           ~                
   72 |             std::make_shared<session>(std::move(socket))->start();
      |             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   73 |           }
      |           ~                
   74 | 
      |                            
   75 |           do_accept();
      |           ~~~~~~~~~~~~     
   76 |         });
      |         ~~                 
In file included from /usr/local/include/boost/asio.hpp:43,
                 from main.cpp:5:
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:1531:3: note: candidate: ‘template<class Executor1, class AcceptToken>  requires  completion_token_for<AcceptToken, void()> auto boost::asio::basic_socket_acceptor<Protocol, Executor>::async_accept(boost::asio::basic_socket<Protocol, Executor1>&, boost::asio::basic_socket_acceptor<Protocol, Executor>::endpoint_type&, AcceptToken&&) [with Executor1 = Executor1; AcceptToken = AcceptToken; Protocol = boost::asio::local::stream_protocol; Executor = boost::asio::any_io_executor]’
 1531 |   async_accept(basic_socket<protocol_type, Executor1>& peer,
      |   ^~~~~~~~~~~~
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:1531:3: note:   template argument deduction/substitution failed:
main.cpp:67:27: note:   ‘server::do_accept()::<lambda(boost::system::error_code, boost::asio::ip::tcp::socket)>’ is not derived from ‘boost::asio::basic_socket<boost::asio::local::stream_protocol, Executor1>’
   67 |     acceptor_.async_accept(
      |     ~~~~~~~~~~~~~~~~~~~~~~^
   68 |         [this](boost::system::error_code ec, tcp::socket socket)
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   69 |         {
      |         ~                  
   70 |           if (!ec)
      |           ~~~~~~~~         
   71 |           {
      |           ~                
   72 |             std::make_shared<session>(std::move(socket))->start();
      |             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   73 |           }
      |           ~                
   74 | 
      |                            
   75 |           do_accept();
      |           ~~~~~~~~~~~~     
   76 |         });
      |         ~~                 
In file included from /usr/local/include/boost/asio.hpp:43,
                 from main.cpp:5:
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:1679:3: note: candidate: ‘template<class MoveAcceptToken>  requires  completion_token_for<MoveAcceptToken, void()> auto boost::asio::basic_socket_acceptor<Protocol, Executor>::async_accept(MoveAcceptToken&&) [with MoveAcceptToken = MoveAcceptToken; Protocol = boost::asio::local::stream_protocol; Executor = boost::asio::any_io_executor]’
 1679 |   async_accept(
      |   ^~~~~~~~~~~~
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:1679:3: note:   template argument deduction/substitution failed:
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:1679:3: note: constraints not satisfied
In file included from /usr/local/include/boost/asio/detail/handler_type_requirements.hpp:53,
                 from /usr/local/include/boost/asio/impl/execution_context.hpp:18,
                 from /usr/local/include/boost/asio/execution_context.hpp:409,
                 from /usr/local/include/boost/asio/detail/scheduler.hpp:21,
                 from /usr/local/include/boost/asio/system_context.hpp:19,
                 from /usr/local/include/boost/asio/impl/system_executor.hpp:21,
                 from /usr/local/include/boost/asio/system_executor.hpp:671,
                 from /usr/local/include/boost/asio/associated_executor.hpp:24,
                 from /usr/local/include/boost/asio/any_completion_handler.hpp:28,
                 from /usr/local/include/boost/asio.hpp:21,
                 from main.cpp:5:
/usr/local/include/boost/asio/async_result.hpp: In substitution of ‘template<class MoveAcceptToken>  requires  completion_token_for<MoveAcceptToken, void()> auto boost::asio::basic_socket_acceptor<boost::asio::local::stream_protocol>::async_accept<MoveAcceptToken>(MoveAcceptToken&&) [with MoveAcceptToken = boost::asio::local::stream_protocol]’:
main.cpp:67:27:   required from here
/usr/local/include/boost/asio/async_result.hpp:1209:20:   required for the satisfaction of ‘completion_token_for<MoveAcceptToken, void(boost::system::error_code, typename Protocol::socket::rebind_executor<Executor>::other)>’ [with MoveAcceptToken = server::do_accept::._anon_255; Executor = boost::asio::any_io_executor; Protocol = boost::asio::local::stream_protocol]
/usr/local/include/boost/asio/async_result.hpp:1212:3:   in requirements with ‘T&& t’ [with Signatures = {void()}; T = server::do_accept::._anon_255]
/usr/local/include/boost/asio/async_result.hpp:1214:37: note: the required expression ‘async_initiate<T, Signatures ...>(boost::asio::detail::initiation_archetype<Signatures ...>{}, t)’ is invalid
 1214 |     async_initiate<T, Signatures...>(
      |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
 1215 |         detail::initiation_archetype<Signatures...>{}, t);
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1plus: note: set ‘-fconcepts-diagnostics-depth=’ to at least 2 for more detail
In file included from /usr/local/include/boost/asio.hpp:43,
                 from main.cpp:5:
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:1936:3: note: candidate: ‘template<class Executor1, class MoveAcceptToken>  requires  completion_token_for<MoveAcceptToken, void()> auto boost::asio::basic_socket_acceptor<Protocol, Executor>::async_accept(const Executor1&, MoveAcceptToken&&, typename boost::asio::constraint<(boost::asio::is_executor<Executor1>::value || boost::asio::execution::is_executor<T>::value)>::type) [with Executor1 = Executor1; MoveAcceptToken = MoveAcceptToken; Protocol = boost::asio::local::stream_protocol; Executor = boost::asio::any_io_executor]’
 1936 |   async_accept(const Executor1& ex,
      |   ^~~~~~~~~~~~
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:1936:3: note:   template argument deduction/substitution failed:
main.cpp: In substitution of ‘template<class Executor1, class MoveAcceptToken>  requires  completion_token_for<MoveAcceptToken, void()> auto boost::asio::basic_socket_acceptor<boost::asio::local::stream_protocol>::async_accept<Executor1, MoveAcceptToken>(const Executor1&, MoveAcceptToken&&, typename boost::asio::constraint<(boost::asio::is_executor<Executor>::value || boost::asio::execution::is_executor<T>::value)>::type) [with Executor1 = boost::asio::local::stream_protocol; MoveAcceptToken = boost::asio::any_io_executor]’:
main.cpp:67:27:   required from here
/usr/local/include/boost/asio/async_result.hpp:1209:20:   required for the satisfaction of ‘completion_token_for<MoveAcceptToken, void(boost::system::error_code, typename Protocol::socket::rebind_executor<typename boost::asio::constraint<(boost::asio::is_executor<Executor1>::value || boost::asio::execution::is_executor<T>::value), Executor1>::type>::other)>’ [with MoveAcceptToken = void; Executor1 = server::do_accept::._anon_255; Protocol = boost::asio::local::stream_protocol]
main.cpp:67:27: error: no type named ‘type’ in ‘struct boost::asio::constraint<false, server::do_accept()::<lambda(boost::system::error_code, boost::asio::ip::tcp::socket)> >’
   67 |     acceptor_.async_accept(
      |     ~~~~~~~~~~~~~~~~~~~~~~^
   68 |         [this](boost::system::error_code ec, tcp::socket socket)
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   69 |         {
      |         ~                  
   70 |           if (!ec)
      |           ~~~~~~~~         
   71 |           {
      |           ~                
   72 |             std::make_shared<session>(std::move(socket))->start();
      |             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   73 |           }
      |           ~                
   74 | 
      |                            
   75 |           do_accept();
      |           ~~~~~~~~~~~~     
   76 |         });
      |         ~~                 
In file included from /usr/local/include/boost/asio.hpp:43,
                 from main.cpp:5:
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:2035:3: note: candidate: ‘template<class ExecutionContext, class MoveAcceptToken>  requires  completion_token_for<MoveAcceptToken, void()> auto boost::asio::basic_socket_acceptor<Protocol, Executor>::async_accept(ExecutionContext&, MoveAcceptToken&&, typename boost::asio::constraint<std::is_convertible<ExecutionContext&, boost::asio::execution_context&>::value>::type) [with ExecutionContext = ExecutionContext; MoveAcceptToken = MoveAcceptToken; Protocol = boost::asio::local::stream_protocol; Executor = boost::asio::any_io_executor]’
 2035 |   async_accept(ExecutionContext& context,
      |   ^~~~~~~~~~~~
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:2035:3: note:   template argument deduction/substitution failed:
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:2035:3: note: constraints not satisfied
main.cpp: In substitution of ‘template<class ExecutionContext, class MoveAcceptToken>  requires  completion_token_for<MoveAcceptToken, void()> auto boost::asio::basic_socket_acceptor<boost::asio::local::stream_protocol>::async_accept<ExecutionContext, MoveAcceptToken>(ExecutionContext&, MoveAcceptToken&&, typename boost::asio::constraint<std::is_convertible<ExecutionContext&, boost::asio::execution_context&>::value>::type) [with ExecutionContext = boost::asio::local::stream_protocol; MoveAcceptToken = boost::asio::any_io_executor]’:
main.cpp:67:27:   required from here
/usr/local/include/boost/asio/async_result.hpp:1209:20:   required for the satisfaction of ‘completion_token_for<MoveAcceptToken, void(boost::system::error_code, typename Protocol::socket::rebind_executor<typename ExecutionContext::executor_type>::other)>’ [with MoveAcceptToken = void; ExecutionContext = server::do_accept::._anon_255; Protocol = boost::asio::local::stream_protocol]
main.cpp:67:27: error: no type named ‘executor_type’ in ‘struct server::do_accept()::<lambda(class boost::system::error_code, boost::asio::ip::tcp::socket)>’
   67 |     acceptor_.async_accept(
      |     ~~~~~~~~~~~~~~~~~~~~~~^
   68 |         [this](boost::system::error_code ec, tcp::socket socket)
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   69 |         {
      |         ~                  
   70 |           if (!ec)
      |           ~~~~~~~~         
   71 |           {
      |           ~                
   72 |             std::make_shared<session>(std::move(socket))->start();
      |             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   73 |           }
      |           ~                
   74 | 
      |                            
   75 |           do_accept();
      |           ~~~~~~~~~~~~     
   76 |         });
      |         ~~                 
In file included from /usr/local/include/boost/asio.hpp:43,
                 from main.cpp:5:
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:2211:3: note: candidate: ‘template<class MoveAcceptToken>  requires  completion_token_for<MoveAcceptToken, void()> auto boost::asio::basic_socket_acceptor<Protocol, Executor>::async_accept(boost::asio::basic_socket_acceptor<Protocol, Executor>::endpoint_type&, MoveAcceptToken&&) [with MoveAcceptToken = MoveAcceptToken; Protocol = boost::asio::local::stream_protocol; Executor = boost::asio::any_io_executor]’
 2211 |   async_accept(endpoint_type& peer_endpoint,
      |   ^~~~~~~~~~~~
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:2211:3: note:   template argument deduction/substitution failed:
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:2211:3: note: constraints not satisfied
In file included from /usr/local/include/boost/asio/detail/handler_type_requirements.hpp:53,
                 from /usr/local/include/boost/asio/impl/execution_context.hpp:18,
                 from /usr/local/include/boost/asio/execution_context.hpp:409,
                 from /usr/local/include/boost/asio/detail/scheduler.hpp:21,
                 from /usr/local/include/boost/asio/system_context.hpp:19,
                 from /usr/local/include/boost/asio/impl/system_executor.hpp:21,
                 from /usr/local/include/boost/asio/system_executor.hpp:671,
                 from /usr/local/include/boost/asio/associated_executor.hpp:24,
                 from /usr/local/include/boost/asio/any_completion_handler.hpp:28,
                 from /usr/local/include/boost/asio.hpp:21,
                 from main.cpp:5:
/usr/local/include/boost/asio/async_result.hpp: In substitution of ‘template<class MoveAcceptToken>  requires  completion_token_for<MoveAcceptToken, void()> auto boost::asio::basic_socket_acceptor<boost::asio::local::stream_protocol>::async_accept<MoveAcceptToken>(boost::asio::basic_socket_acceptor<boost::asio::local::stream_protocol>::endpoint_type&, MoveAcceptToken&&) [with MoveAcceptToken = boost::asio::local::stream_protocol]’:
main.cpp:67:27:   required from here
/usr/local/include/boost/asio/async_result.hpp:1209:20:   required for the satisfaction of ‘completion_token_for<MoveAcceptToken, void(boost::system::error_code, typename Protocol::socket::rebind_executor<Executor>::other)>’ [with MoveAcceptToken = void; Executor = boost::asio::any_io_executor; Protocol = boost::asio::local::stream_protocol]
/usr/local/include/boost/asio/async_result.hpp:1212:3:   in requirements with ‘T&& t’ [with Signatures = {void()}; T = void]
/usr/local/include/boost/asio/async_result.hpp:1212:3: error: forming reference to void
 1212 |   requires(T&& t)
      |   ^~~~~~~~~~~~~~~
 1213 |   {
      |   ~
 1214 |     async_initiate<T, Signatures...>(
      |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 1215 |         detail::initiation_archetype<Signatures...>{}, t);
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 1216 |   };
      |   ~
In file included from /usr/local/include/boost/asio.hpp:43,
                 from main.cpp:5:
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:2500:3: note: candidate: ‘template<class Executor1, class MoveAcceptToken>  requires  completion_token_for<MoveAcceptToken, void()> auto boost::asio::basic_socket_acceptor<Protocol, Executor>::async_accept(const Executor1&, boost::asio::basic_socket_acceptor<Protocol, Executor>::endpoint_type&, MoveAcceptToken&&, typename boost::asio::constraint<(boost::asio::is_executor<Executor1>::value || boost::asio::execution::is_executor<T>::value)>::type) [with Executor1 = Executor1; MoveAcceptToken = MoveAcceptToken; Protocol = boost::asio::local::stream_protocol; Executor = boost::asio::any_io_executor]’
 2500 |   async_accept(const Executor1& ex, endpoint_type& peer_endpoint,
      |   ^~~~~~~~~~~~
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:2500:3: note:   template argument deduction/substitution failed:
main.cpp:67:27: note:   candidate expects 4 arguments, 1 provided
   67 |     acceptor_.async_accept(
      |     ~~~~~~~~~~~~~~~~~~~~~~^
   68 |         [this](boost::system::error_code ec, tcp::socket socket)
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   69 |         {
      |         ~                  
   70 |           if (!ec)
      |           ~~~~~~~~         
   71 |           {
      |           ~                
   72 |             std::make_shared<session>(std::move(socket))->start();
      |             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   73 |           }
      |           ~                
   74 | 
   75 |           do_accept();

   76 |         });

In file included from /usr/local/include/boost/asio.hpp:43,
                 from main.cpp:5:
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:2603:3: note: candidate: ‘template<class ExecutionContext, class MoveAcceptToken>  requires  completion_token_for<MoveAcceptToken, void()> auto boost::asio::basic_socket_acceptor<Protocol, Executor>::async_accept(ExecutionContext&, boost::asio::basic_socket_acceptor<Protocol, Executor>::endpoint_type&, MoveAcceptToken&&, typename boost::asio::constraint<std::is_convertible<ExecutionContext&, boost::asio::execution_context&>::value>::type) [with ExecutionContext = ExecutionContext; MoveAcceptToken = MoveAcceptToken; Protocol = boost::asio::local::stream_protocol; Executor = boost::asio::any_io_executor]’
 2603 |   async_accept(ExecutionContext& context,
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:2603:3: note:   template argument deduction/substitution failed:
main.cpp:67:27: note:   candidate expects 4 arguments, 1 provided
   67 |     acceptor_.async_accept(
      |     ~~~~~~~~~~~~~~~~~~~~~~^
   68 |         [this](boost::system::error_code ec, tcp::socket socket)
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   69 |         {
      |         ~                  
   70 |           if (!ec)
      |           ~~~~~~~~         
   71 |           {
      |           ~                
   72 |             std::make_shared<session>(std::move(socket))->start();
      |             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

   75 |           do_accept();
   76 |         });

Versão do meu boost:

#include <boost/version.hpp>
#include <iostream>

int main() {
std::cout << "Using Boost "     
          << BOOST_VERSION / 100000     << "."  // major version
          << BOOST_VERSION / 100 % 1000 << "."  // minor version
          << BOOST_VERSION % 100                // patch level
          << std::endl;    
    return 0;
}
Using Boost 1.82.0
c++
  • 1 respostas
  • 47 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve