Boost logo

Boost Users :

From: Fred Lupien (fred.lupien_at_[hidden])
Date: 2007-09-30 16:57:38


Honestly I have been looking for a solution for hours before I made this
post. I am not so familiar with boost, the only module I use is
serialization so maybe my error is obvious but I went through all the doc on
boost.org without luck.

I should have been more descriptive I my first post. I does not work because
I get unresolved externals on the base class save / load functions when I
implement the derived class save/load functions. I am using the intrusive
version of serialization so their should be no particular namespace
requirement. Here is a simplified example of my problem:

///////////////////////////////////// A.h
Class A:
{
    friend class boost::serialization::access;
    template<class Archive>
    void save(Archive & ar, const unsigned int version) const;
    template<class Archive>
    void load(Archive & ar, const unsigned int version);

    BOOST_SERIALIZATION_SPLIT_MEMBER()

};
/////////////////////////////////////

///////////////////////////////////// B.h
class B: public A
{
    friend class boost::serialization::access;
    template<class Archive>
    void save(Archive & ar, const unsigned int version) const;

    template<class Archive>
    void load(Archive & ar, const unsigned int file_version );

    BOOST_SERIALIZATION_SPLIT_MEMBER()
}
BOOST_CLASS_EXPORT_GUID(B, "B")
/////////////////////////////////////

///////////////////////////////////// A.cpp
template<class Archive>
void A::save(Archive & ar, const unsigned int version) const
{
    ar & var1;
}

template<class Archive>
void A::load(Archive & ar, const unsigned int file_version )
{
    ar & var;
    somestuff();
}
/////////////////////////////////////

///////////////////////////////////// B.cpp
template<class Archive>
void B::save(Archive & ar, const unsigned int version) const
{
    ar & boost::serialization::base_object<A>(*this);
    ar & var2;
}

template<class Archive>
void B::load(Archive & ar, const unsigned int file_version )
{
    ar & boost::serialization::base_object<A>(*this);
    ar & var2;
    morestuff();
}
 /////////////////////////////////////

If I don't put the two implementation of serialization of A and B in the
same file I get this error:

error LNK2019: unresolved external symbol "public: void __thiscall
A::save<class boost::archive::text_oarchive> ...
error LNK2019: unresolved external symbol "public: void __thiscall
A::load<class boost::archive::text_iarchive> ...

Feel free to redirect me to some more documentation, I read most of
boost.org serialization section but maybe their are other places to look at.

I am also having problem figuring out the when to use BOOST_CLASS_EXPORT vs
BOOST_CLASS_EXPORT_GUID vs ar.register_types.

Thank you for your help.

On 9/30/07, Robert Ramey <ramey_at_[hidden]> wrote:
>
> A easy way to fix this would be to put the serialization code in the
> source file instead of the header file but I can't get this to work...
>
> There is no reason why this shouldn't work. Invest some effort figuring
> out why it won't link. Check namespaces.
>
> Robert Ramey
>
> "Fred Lupien" <fred.lupien_at_[hidden]> wrote in message
> news:32e6d6bf0709300738u77850377t2bf40ec5501b882f_at_mail.gmail.com...
> Hi,
>
> I am using the boost serialization library in a personal project and
> ran into a recursive include problem. Class A serialize an object of class B
> and class B also serialize an object of class A. So class A must be a
> complete type in class B and class B must be a complete type in class A,
> hence the recursive include problem. I always end up with unresolved
> externals if the body of my serialization functions are not within the
> header file. Any way around this beside switching to non-intrusive
> serialization?
>
> thanx!
>
> --
> Frédérick Martel-Lupien
> Étudiant en Génie Informatique
> Université de Sherbrooke
> fred.lupien_at_[hidden]
>
> ------------------------------
>
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users
>
>
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users
>

-- 
Frédérick Martel-Lupien
Étudiant en Génie Informatique
Université de Sherbrooke
fred.lupien_at_[hidden]


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net