[serialization] std::list compiler error

Hello, I want to use boost/serialization combined with the MPI (Message Passing Interface) to add parallel computation to a traffic simulation i am working on. I want to serialize a STL container filled with custom Objects to send it to another process. If I don't set "boost::serialization::track_never" for every class i get a compiler error. The Example Code (without any MPI) below creates this error when compiled: g++ test3.cpp -I/usr/include -L/usr/lib -lboost_serialization -o test3 /usr/include/boost/archive/detail/oserializer.hpp: In function void boost::archive::save(Archive&, T&) [with Archive = boost::archive::text_oarchive, T = gps_packet]: /usr/include/boost/archive/basic_text_oarchive.hpp:78: instantiated from void boost::archive::basic_text_oarchive<Archive>::save_override(T&, int) [with T = gps_packet, Archive = boost::archive::text_oarchive] /usr/include/boost/archive/detail/interface_oarchive.hpp:78: instantiated from Archive& boost::archive::detail::interface_oarchive<Archive>::operator<<(T&) [with T = gps_packet, Archive = boost::archive::text_oarchive] test3.cpp:76: instantiated from here /usr/include/boost/archive/detail/oserializer.hpp:567: error: invalid application of sizeof to incomplete type boost::STATIC_ASSERTION_FAILURE<false> make: *** [test3] Error 1 Here is a short example that creates the above error based upon the example in the documentation: ---code start-------- #include <iostream> #include <sstream> #include <boost/archive/text_oarchive.hpp> #include <boost/archive/text_iarchive.hpp> #include <boost/serialization/list.hpp> #include <list> class gps_position { private: friend class boost::serialization::access; template<class Archive> void serialize(Archive & ar, const unsigned int version) { ar & degrees; ar & minutes; ar & seconds; } int degrees; int minutes; float seconds; public: gps_position(){}; gps_position(int d, int m, float s) : degrees(d), minutes(m), seconds(s) {} void pretty_print() { std::cout << "deg:" << degrees ; std::cout << " min:" << minutes ; std::cout << " sec:" << seconds << std::endl; } }; typedef std::list<gps_position> list_gps_position; class gps_packet { private: friend class boost::serialization::access; template<class Archive> void serialize(Archive & ar, const unsigned int version) { ar & gps_list; } public: gps_packet(){} list_gps_position gps_list; }; // only when I uncomment the following // boost::serialization::track_never // statements programm will compile //BOOST_CLASS_IMPLEMENTATION(gps_position,boost::serialization::object_serializable); //BOOST_CLASS_TRACKING(gps_position, boost::serialization::track_never); //BOOST_CLASS_IMPLEMENTATION(gps_packet,boost::serialization::object_serializable); //BOOST_CLASS_TRACKING(gps_packet, boost::serialization::track_never); int main() { // create come pseudo data gps_position g0(1, 2, 3.3); gps_position g1(11, 22, 33.33); gps_packet packet; packet.gps_list.push_back(g0); packet.gps_list.push_back(g1); // print before transfer std::cout << "Before:" << std::endl; packet.gps_list.front().pretty_print(); packet.gps_list.back().pretty_print(); // serialize to chars in order to use // the MPI::CHAR elementary datatype std::ostringstream ost; boost::archive::text_oarchive oa(ost); oa << packet; const char* chars = ost.str().data(); // assume some message passing // through MPI::CHAR to happen here std::cout << "Transfering:" << std::endl; std::cout << chars << std::endl; // reconstruction from chars for further // computation std::istringstream ist(chars); boost::archive::text_iarchive ia(ist); gps_packet packet_new; ia >> packet_new; // print transfer result std::cout << "After:" << std::endl; packet_new.gps_list.front().pretty_print(); packet_new.gps_list.back().pretty_print(); return 0; } ---code end-------- when i uncomment BOOST_CLASS_TRACKING(gps_position, boost::serialization::track_never); BOOST_CLASS_TRACKING(gps_packet, boost::serialization::track_never); i can compile and execute with this output: Before: deg:1 min:2 sec:3.3 deg:11 min:22 sec:33.33 Transfering: 22 serialization::archive 3 0 0 0 0 2 0 0 1 2 3.3 11 22 33.330002 After: deg:1 min:2 sec:3.3 deg:11 min:22 sec:33.33 Further Questions: 1. I would also like to use just list<gps_position> or the typedef, instead of the wrapper class gps_packet which i need to pass something to BOOST_CLASS_TRACKING(gps_packet, boost::serialization::track_never); 2. Is it a good Idea to use something like: BOOST_CLASS_IMPLEMENTATION(gps_position,boost::serialization::object_serializable); BOOST_CLASS_TRACKING(gps_position,boost::serialization::track_never); since I don't want to store but just pass the Information or are there any pitfalls? Thanks, Stephan Nies -- When you see this text i am using the webinterface of my mail provider and i apologize for any commercials they may attach below. Echte DSL-Flatrate dauerhaft für 0,- Euro*! "Feel free" mit GMX DSL! http://www.gmx.net/de/go/dsl
participants (1)
-
Stephan Nies