[GELÖST] Boost Serialisierung unter VC 2005 löst STATIC_ASSERTION_FAILURE aus



  • Hi!

    Ich arbeite zum ersten mal mit Boost::Serialization. Dazu habe ich mir ein einfaches Test-Programm gebastelt:

    class Test
    {
    	friend class boost::serialization::access;
    public:
    	Test(int i, double d, const std::string& t, const std::vector<std::string>& v) : _ganz(i), _fliess(d), _name(t), _vec(v) {}
    	Test() : _ganz(23), _fliess(42.23), _name("Hallo"), _vec(4)
    	{
    		_vec.push_back("Hallo");
    		_vec.push_back("das");
    		_vec.push_back("ist");
    		_vec.push_back("Super!");
    	}
    
    protected:
    
        template<class Archive>
        void serialize(Archive& ar, const unsigned int version) const
        {
            ar & BOOST_SERIALIZATION_NVP(_vec) & BOOST_SERIALIZATION_NVP(_fliess) & BOOST_SERIALIZATION_NVP(_ganz) & BOOST_SERIALIZATION_NVP(_name);
        }
    
    	int			_ganz;
    	double		_fliess;
    	std::string _name;
    	std::vector<std::string> _vec;
    };
    
    int main(int argc, char* argv[])
    {
    	const char* filename = "C:\\temp.xml";
    	{
    		Test s();
    
    		// make an archive
    		std::ofstream ofs(filename);
    		assert(ofs.good());
    		boost::archive::xml_oarchive oa(ofs);
    		oa << BOOST_SERIALIZATION_NVP(s);
    	}
    
    	{
    		Test s();
    
    		// open the archive
    		std::ifstream ifs(filename);
    		assert(ifs.good());
    		boost::archive::xml_iarchive ia(ifs);
    
    		// restore the schedule from the archive
    	    ia >> BOOST_SERIALIZATION_NVP(s);
    	}
    
    	int i = 0;
    	std::cin >> i;
    	return 0;
    }
    

    Allerdings bekomme ich bei diesem Code mit den entsprechenden Includes unter dem VC++ 2005 Compiler folgenden Fehler:

    boost_1_34_1\boost/archive/detail/oserializer.hpp(315) : error C2027: Verwendung des undefinierten Typs "boost::STATIC_ASSERTION_FAILURE<x>"
    with
    [
    x=false
    ]
    boost_1_34_1\boost/archive/detail/oserializer.hpp(309): Bei der Kompilierung der Klassen-template der void boost::archive::detail::save_non_pointer_type<Archive,T>::invoke(Archive &,T (__cdecl &))-Memberfunktion
    with
    [
    Archive=boost::archive::xml_oarchive,
    T=Test (void)
    ]
    boost_1_34_1\boost/archive/detail/oserializer.hpp(535): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "boost::archive::detail::save_non_pointer_type<Archive,T>".
    with
    [
    Archive=boost::archive::xml_oarchive,
    T=Test (void)
    ]
    boost_1_34_1\boost/archive/detail/common_oarchive.hpp(62): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void boost::archive::save<Archive,T>(Archive &,T (__cdecl &))".
    with
    [
    Archive=boost::archive::xml_oarchive,
    T=Test (void)
    ]

    Habe schon versucht mittels BOOST_CLASS_IMPLEMENTATION den Implementation-Level explizit auf object_class_info zu setzen und das Tracking auszuschalten (BOOST_CLASS_TRACKING mit track_never).
    Beides jedoch ohne Erfolg.

    Wie bekomme ich Boost::Serialization ans Laufen?

    Mfg NeuroCoder



  • Hi!

    Problem gelöst:

    // Statt
    Test s();
    // habe ich einfach
    Test s;
    // genommen
    
    // Zusätzlich muss allerdings noch das const in der serialize Funktion entfernt werden:
        template<class Archive>
        void serialize(Archive& ar, const unsigned int version)
        {
            ar & BOOST_SERIALIZATION_NVP(_vec) /* etc */;
        }
    

    Mfg NeuroCoder


Anmelden zum Antworten