Bonjour,

Voici mon problème :
J'ai une classe Mere qui sert d'interface et qui contient une fonction virtuelle pure. La classe définit donc des méthodes, mais possède également des attributs. J'ai implémenté la sérialisation avec Boost dans la classe Mere.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#ifndef _MERE_H_
#define _MERE_H_
 
// Librairies Boost pour la serialisation
#include <boost/archive/xml_oarchive.hpp>     // Archive pour l'écriture XML
#include <boost/archive/xml_iarchive.hpp>     // Archive pour la lecture des fichiers XML
#include <boost/serialization/nvp.hpp>        // "Pair nom-valeur"
 
#include <string>
#include <fstream>
 
class Mere
{
  public :
    Mere(int a = 0);
 
    virtual void abstrait() {};
 
  protected:
    int m_a;
 
  protected :
    friend class boost::serialization::access;
    template<class Archive> void save( Archive &ar, const unsigned int version ) const;
    {
      using boost::serialization::make_nvp;
      ar & make_nvp("a",m_a);
    }
    template<class Archive> void load( Archive &ar, const unsigned int version );
    {
      using boost::serialization::make_nvp;
      ar & make_nvp("a",m_a);
    }
 
    BOOST_SERIALIZATION_SPLIT_MEMBER()
};
 
#endif
J'ai une classe Fille qui hérite de mère et qui redéfinit toutes les fonctions virtuelles pures et qui implémente également la sérialisation.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#ifndef _FILLE_H_
#define _FILLE_H_
 
#include "mere.h"
 
class Fille : public Mere
{
  public :
    Fille();
    Fille(int a , double b);
    void abstrait();
  protected:
    int m_b;
 
  private:
    friend class boost::serialization::access;
    template<class Archive> void save( Archive &ar, const unsigned int version ) const;
    {
      using boost::serialization::make_nvp;
      ar & make_nvp("Mere",boost::serialization::base_object<Mere>(*this));
      ar & make_nvp("b",m_b);
    }
    template<class Archive> void load( Archive &ar, const unsigned int version );
    {
      using boost::serialization::make_nvp;
      ar & make_nvp("Mere",boost::serialization::base_object<Mere>(*this));
      ar & make_nvp("b",m_b);
    }
 
    BOOST_SERIALIZATION_SPLIT_MEMBER()
};
 
#endif
Dans le main, j'implémente un pointeur sur la classe Fille
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
#include "fille.h"
 
int main(int argc, char* argv[])
{
  Fille *ptrFille = new Fille(1, 2.0);
 
}
A la compilation, j'ai le problème suivant :
g++ -g -o zone51 main.o -L. -lstdc++ -lboost_serialization -lmere -lfille
./libfille.so: undefined reference to `void Mere::save<boost::archive : : xml_oarchive>(boost::archive : : xml_oarchive&, unsigned int) const'
./libfille.so: undefined reference to `void Mere::load<boost::archive : : xml_iarchive>(boost::archive : : xml_iarchive&, unsigned int)'
collect2: ld a retourné 1 code d'état d'exécution
make: *** [zone51] Erreur 1
Le problème semble provenir du fait que ma classe Mere est une classe abstraite.
Ma question est donc comment faire pour sérialiser les classes qui héritent de Mere?