2010-11-06 28 views
3

J'essaie de suivre cet exemple http://www.boost.org/doc/libs/1_42_0/libs/serialization/doc/serialization.html#constructors mais je continue à recevoir des erreurs. Suivant l'exemple, je reçois une erreur en essayant d'accéder à une variable privée (juste assez):Dépannage de save_construct_data lors de la sérialisation d'un pointeur sur une classe sans constructeur par défaut

bs.cpp:10: error: ‘const int my_class::m_attribute’ is private 

Mais, si j'ajoute save_construct_data comme ami, je reçois une erreur d'ambiguïté:

/usr/include/boost/serialization/serialization.hpp:148: error: call of overloaded ‘save_construct_data(boost::archive::text_oarchive&, const my_class*&, const boost::serialization::version_type&)’ is ambiguous 
/usr/include/boost/serialization/serialization.hpp:83: note: candidates are: void boost::serialization::save_construct_data(Archive&, const T*, unsigned int) [with Archive = boost::archive::text_oarchive, T = my_class] 
bs.cpp:10: note:     void boost::serialization::save_construct_data(Archive&, const my_class*, unsigned int) [with Archive = boost::archive::text_oarchive] 
bs.cpp:29: note:     void boost::serialization::save_construct_data(Archive&, const my_class*, unsigned int) [with Archive = boost::archive::text_oarchive] 

I peut déplacer la définition de la fonction à la déclaration d'ami, mais c'est juste moche.

Que dois-je essayer après?

Merci, Jayen

+0

Pouvez-vous montrer le code de votre tenter de déclarer 'save_construct_data' comme ami? –

+0

http://pastebin.com/embed_iframe.php?i=d9zBvJag - spécifiquement "template ami void boost :: sérialisation :: save_construct_data (Archive & ar, const ma_classe * t, const unsigned int file_version);" – Jayen

Répondre

6

save_construct_data doit être déclaré avant de pouvoir être ami. Quelque chose à propos d'être dans un espace de noms différent. Comme ceci:

namespace boost { namespace serialization { 
template<class Archive> 
inline void save_construct_data(Archive & ar, const my_class * t, const unsigned int file_version); 
}} 

Mais, parce que cela dépend my_class, vous devez déclarer my_class ainsi:

class my_class; 

Alors la chose ressemble http://pastebin.com/embed_iframe.php?i=aFyCpjyY

-1

Assurez-vous que la méthode save_construct_data est pas déclarée dans une portée différente d'ailleurs celle dont la bibliothèque boost appelle les méthodes (boost :: sérialisation)

Déclarant la save_construct_data dans un l'espace de noms personnalisé provoquera des problèmes d'ambiguïté, car boost ne saura pas quelle méthode appeler

+0

save_construct_data est déclaré dans l'étendue à partir de laquelle la bibliothèque boost appelle les méthodes (boost :: serialization) – Jayen

+0

Correct, ce qui est ce que je voulais dire pourrait causer le problème. Disons que vous avez espace de nom bla {{ classe blah2 ... save_construct_data void (...) {...}} } vous ont placé la méthode save_construct_data dans l'espace de noms blah et vous aurez un erreur d'ambiguïté –

+0

Je viens de dire que j'ai l'espace de nommage boost {namespace sérialisation {... void save_construct_data (...) {...}}} et j'ai placé la méthode save_construct_data dans l'espace de nommage boost :: serialization. – Jayen