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.