J'ai une classe, avec des attributs que je définis comme ceci:

private:
    const std::string m_ip;
    bool is_connected;
    boost::asio::io_service m_io_service;
    tcp::resolver m_resolver;
    tcp::resolver::query m_query;
    tcp::resolver::iterator m_endpoint_iterator;
    tcp::socket m_socket;

Et les implémentations du constructeur, que je définis comme ceci:

Connection::Connection(const std::string ip) 
    : m_ip(ip)
    , is_connected(false)
    , m_resolver(tcp::resolver(&m_io_service))
    , m_query(tcp::resolver::query(m_ip, "connect_back"))
    , m_endpoint_iterator(m_resolver.resolve(m_query))
    , m_socket(tcp::socket(m_io_service))
{}

Ici, dans le constructeur, je définis presque tous les attributs comme ils doivent être définis.

Mais j'ai un problème que je n'ai jamais eu dans un fichier .cpp complet: quand je définis le résolveur dans le constructeur, le compilateur dit que j'ai une erreur:

/home/User/C++ Projects/Client/Network.cpp:9: error: no matching function for call to ‘boost::asio::ip::basic_resolver<boost::asio::ip::tcp>::basic_resolver(boost::asio::io_service*)’
 Connection::Connection(const std::string ip) : m_ip(ip), is_connected(false), m_resolver(tcp::resolver(&m_io_service)), m_query(tcp::resolver::query(m_ip, "connect_back")), m_endpoint_iterator(m_resolver.resolve(m_query)), m_socket(tcp::socket(m_io_service)){
                                                                                                                ^

Je ne comprends pas pourquoi, car j'utilise les choses ordinaires!

Des idées?

PS: Si j'essaye de supprimer le & de m_io_service, j'obtiens encore plus d'erreurs:

/home/User/C++ Projects/Client/Network.cpp:9: error: use of deleted function ‘boost::asio::ip::basic_resolver<boost::asio::ip::tcp>::basic_resolver(boost::asio::ip::basic_resolver<boost::asio::ip::tcp>&&)’
Connection::Connection(const std::string ip) : m_ip(ip), 
is_connected(false), 
m_resolver(tcp::resolver(m_io_service)), 
m_query(tcp::resolver::query(m_ip, "connect_back")),
m_endpoint_iterator(m_resolver.resolve(m_query)),
m_socket(tcp::socket(m_io_service)){

ET

/usr/include/boost/asio/ip/basic_resolver.hpp:44: error: ‘boost::asio::basic_io_object<IoObjectService, Movable>::basic_io_object(const boost::asio::basic_io_object<IoObjectService, Movable>&) [with IoObjectService = boost::asio::ip::resolver_service<boost::asio::ip::tcp>; bool Movable = false]’ is private within this context

0
Minege 16 janv. 2017 à 23:09

2 réponses

Meilleure réponse

Ajoutant à la réponse de @ Muscampester, il semble que votre constructeur est redondant.

Connection::Connection(const std::string ip) 
    : m_ip(ip)
    , is_connected(false)
    , m_resolver(tcp::resolver(&m_io_service))
    , m_query(tcp::resolver::query(m_ip, "connect_back"))
    , m_endpoint_iterator(m_resolver.resolve(m_query))
    , m_socket(tcp::socket(m_io_service))
{}

Doit être écrit comme ceci:

//I changed this to const& because, while Copy Ellision *might* optimize this, it's still 
//more semantically correct to pass by const reference.
Connection::Connection(const std::string & ip) 
    : m_ip(ip)
    , is_connected(false)
      //Note that we're no longer referring to the underlying type.
    , m_resolver(m_io_service)
    , m_query(m_ip, "connect_back")
    , m_endpoint_iterator(m_resolver.resolve(m_query))
    , m_socket(m_io_service)
{}

La différence étant que vos objets résolveur, requête et socket ne sont plus "construits par déplacement", et sont à la place directement construits. Sur la base de la deuxième erreur que vous obtenez, il semble que vous utilisez une version de boost dans laquelle ces objets ne sont pas mobiles / modifiables (ou éventuellement boost jamais destinés à ce que ces types soient mobiles; je ne sais pas lequel).

Si vous utilisez une ancienne version de boost, essayez de mettre à jour vers une version ultérieure de la bibliothèque. Que vous le fassiez ou non, cependant, vous devrez mettre à jour le code afin de ne plus construire inutilement de déplacement.

2
Xirema 16 janv. 2017 à 20:50