2016-11-23 5 views
0

Utilisation de la fonction Boost Bind avec un pointeur et une fonction Boost uniques de Boost Je reçois des erreurs de lien en fonction de la manière dont je passe un rappel à la fonction de réception.
Si je crée une variable de membre Boost Function en liant un rappel contenant un pointeur unique boost et que je le passe à la fonction de réception, cela entraîne des erreurs de liens lorsque j'utilise le pointeur unique lorsque le rappel est appelé.Erreur de lieur lors de l'utilisation de Boost Pointeur unique avec fonction Boost Bind et Boost

Si j'effectue la liaison en place lors de l'appel de la fonction de réception, je n'obtiens pas les erreurs de l'éditeur de liens et le code se comporte comme prévu.

Exemple de code:

class test 
{ 
public: 
    test() : callback_(boost::bind(&test::callback, this, _1, _2)) 

    void start() 
    { 
     // using boost function pointer, 
     // this fails with linker errors 
     accept(callback_);         // (Method 1) 

     // using in place bind 
     // this is OK 
     accept(boost::bind(&test::callback, this, _1, _2)); // (Method 2) 
    } 

    void callback(BOOST_RV_REF(boost::movelib::unique_ptr<message>) message, 
        int version) 
    { 
     // attempting to use message if implemented as (Method 1) will result in linker errors 

     message->get_body(); // If I comment out this line then both methods compile and link??? 
    } 

    boost::function 
      < void (BOOST_RV_REF(boost::movelib::unique_ptr <message>) message, 
       int version) > callback_; 

}; 


class callback_tester 
{ 
    callback_tester(){}; 

    void accept(boost::function 
        < void (BOOST_RV_REF(boost::movelib::unique_ptr <message>) message, 
          int version) callback) 
    { 
     // Assignment to local member variable is fine here so we 
     // can invoke the callback at a later stage. 
     test_callback_ = callback;    

     test_callback_(boost::move(message_), version_); 
    } 


    // define handler to store and invoke test callback 
    boost::function 
      < void (BOOST_RV_REF(boost::movelib::unique_ptr <message>) message, 
       int version) > test_callback_; 
    boost::movelib::unique_ptr<message> message_; 
    int version_; 
}; 

Certaines des erreurs de liaison sont les suivantes:

Error: symbol `_ZN5boost8functionIFvRKNS_6system10error_codeERNS_2rvINS_7movelib10unique_ptrIN5cayan3hal7network10tcp_socketENS6_14default_deleteISB_EEEEEEEED2Ev' is already defined 
Error: symbol `_ZN5boost9function2IvRKNS_6system10error_codeERNS_2rvINS_7movelib10unique_ptrIN5cayan3hal7network10tcp_socketENS6_14default_deleteISB_EEEEEEED2Ev' is already defined 
Error: symbol `_ZNSt15binary_functionIRKN5boost6system10error_codeERNS0_2rvINS0_7movelib10unique_ptrIN5cayan3hal7network10tcp_socketENS6_14default_deleteISB_EEEEEEvEC2Ev' is already defined 
... 

Quelqu'un peut-il me dire quelle est la différence entre les deux méthodes et pourquoi les erreurs de l'éditeur de liens apparaissent uniquement lorsque essayer d'accéder au pointeur unique lorsque la méthode 1 est utilisée?

J'ai rencontré certaines informations que le rappel devrait être CopyConstructible à utiliser avec boost :: function. Mais si cela est vrai, je m'attendrais à ce que les deux méthodes se lient et passent un callback contenant un pointeur unique à l'échec.

Répondre

0

message la classe doit avoir un suppresseur explicitement déclaré au moins ~ message() = par défaut;