But I've already tried that, as I said. It fails at runtime with an exception saying "unregistered void cast". I'll test it once more, but I don't expect different results.

On Thu, Apr 2, 2009 at 10:07 PM, Robert Ramey <ramey@rrsd.com> wrote:
Look at the pimple demo in the examples or test directory.  Basically you're getting some things defined twiice.
 
Move the implementation of template< class Archive >
        void serialize( Archive& archive, unsigned int version ) to the *.cpp
and move
BOOST_CLASS_EXPORT( rs::StaticText )

to the *.cpp file as well.  compile that/those *.cpp files and include in the library. This is touched upon in the manual in the part describing EXPORT.
 
Robert Ramey
"Robert Dailey" <rcdailey@gmail.com> wrote in message news:496954360904021720o79c9c17cs18b1cf3f53da08c@mail.gmail.com...
Hi,

I'm currently trying to polymorphically serialize a class without using RTTI. I'm doing this currently in a file called StaticText.hpp:

#ifndef RS_GUI_WIDGETS_STATICTEXT_HPP
#define RS_GUI_WIDGETS_STATICTEXT_HPP

#include <boost/scoped_ptr.hpp>
#include <boost/serialization/access.hpp>
#include <boost/serialization/base_object.hpp>
#include <boost/serialization/string.hpp>
#include <boost/serialization/extended_type_info_no_rtti.hpp>
#include <boost/serialization/export.hpp>

#include <rs/gui/widgets/Widget.hpp>
#include <rs/gui/Text.hpp>


namespace rs
{
    class StaticText : public Widget
    {
    public:
        StaticText( std::string const& text );

        void Update();
        void Render( RenderSystem& renderer, Camera& camera );
        char const* get_key() const;

    private:
        StaticText() {}

        template< class Archive >
        void serialize( Archive& archive, unsigned int version )
        {
            archive & boost::serialization::base_object<Widget>( *this );

            std::string text;
            archive & text;
            m_text.reset( new Text( text ) );
        }

        boost::scoped_ptr<Text> m_text;

        friend class boost::serialization::access;
    };
}

BOOST_CLASS_TYPE_INFO(
    rs::StaticText,
    extended_type_info_no_rtti<rs::StaticText>
    )

BOOST_CLASS_EXPORT( rs::StaticText )

#endif // RS_GUI_WIDGETS_STATICTEXT_HPP

When I compile this into a LIB first, and then link the lib into an EXE, the linker says this (Visual Studio 2008):
gui.lib(StaticText.obj) : error LNK2005: "public: static struct boost::archive::detail::guid_initializer<class rs::StaticText> const & const boost::archive::detail::init_guid<class rs::StaticText>::guid_initializer" (?guid_initializer@?$init_guid@VStaticText@rs@@@detail@archive@boost@@2ABU?$guid_initializer@VStaticText@rs@@@234@B) already defined in main.obj

If I move the 2 macro calls into the StaticText.cpp file, everything compiles/links just fine but I end up getting an exception thrown at runtime that says "unregistered void cast".


_______________________________________________
Boost-users mailing list
Boost-users@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users


_______________________________________________
Boost-users mailing list
Boost-users@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users