Hello !
I am a newbie to Boost ... and trying to use it in order
to serialize a complex data structure for one of my project. (the
struct particle)
You can see the nested data structure at the end of this file.
I have started from the 'leafs' and yet trying to serialize a point
which is a variable of a PointAccumulator. You can see the point.h file
below.
Here is the test code I am using to try to serialize it.
Note that I read a few succinct tutorials and already succesfully compiled some simple examples.
...
GMapping::point<int>p = GMapping::point<int>();
//saveIntoFile<text_oarchive>(particlesSaved[1].map.cell(1,1).acc, "outTest.txt");
saveIntoFile<text_oarchive>(p, "outTest.txt");
...
template <class T> void RobotController::saveIntoFile(GMapping::point<int>& p, const char* file){
std::ofstream ofile(file);
T ar(ofile);
ar << p;
ofile.close();
}
However when compiling; it raises the following error:
...
/usr/include/boost/archive/detail/oserializer.hpp:
In function ‘void boost::archive::save(Archive&, T&) [with
Archive = boost::archive::text_oarchive, T =
GMapping::point<int>]’:
/usr/include/boost/archive/detail/common_oarchive.hpp:64: instantiated from ‘void boost::archive::detail::common_oarchive<Archive>::save_override(T&, int) [with T = GMapping::point<int>, Archive = boost::archive::text_oarchive]’
/usr/include/boost/archive/basic_text_oarchive.hpp:75: instantiated from ‘void boost::archive::basic_text_oarchive<Archive>::save_override(T&, int) [with T = GMapping::point<int>, Archive = boost::archive::text_oarchive]’
/usr/include/boost/archive/detail/interface_oarchive.hpp:64: instantiated from ‘Archive& boost::archive::detail::interface_oarchive<Archive>::operator<<(T&) [with T = GMapping::point<int>, Archive = boost::archive::text_oarchive]’
RobotController.cpp:186: instantiated from ‘void RobotController::saveIntoFile(GMapping::point<int>, const char*) [with T = boost::archive::text_oarchive]’
RobotController.cpp:223: instantiated from here
/usr/include/boost/archive/detail/oserializer.hpp:564: error: invalid application of ‘sizeof’ to incomplete type ‘boost::STATIC_ASSERTION_FAILURE<false>’
/usr/include/boost/archive/detail/common_oarchive.hpp:64: instantiated from ‘void boost::archive::detail::common_oarchive<Archive>::save_override(T&, int) [with T = GMapping::point<int>, Archive = boost::archive::text_oarchive]’
/usr/include/boost/archive/basic_text_oarchive.hpp:75: instantiated from ‘void boost::archive::basic_text_oarchive<Archive>::save_override(T&, int) [with T = GMapping::point<int>, Archive = boost::archive::text_oarchive]’
/usr/include/boost/archive/detail/interface_oarchive.hpp:64: instantiated from ‘Archive& boost::archive::detail::interface_oarchive<Archive>::operator<<(T&) [with T = GMapping::point<int>, Archive = boost::archive::text_oarchive]’
RobotController.cpp:186: instantiated from ‘void RobotController::saveIntoFile(GMapping::point<int>, const char*) [with T = boost::archive::text_oarchive]’
RobotController.cpp:223: instantiated from here
/usr/include/boost/archive/detail/oserializer.hpp:564: error: invalid application of ‘sizeof’ to incomplete type ‘boost::STATIC_ASSERTION_FAILURE<false>’
make: *** [RobotController.o] Error 1
Anyone understands what is the error ?
I
read I had to give a constant reference to the object while calling the
operator << ... but I don't really understand it.
I am using Ubuntu 9.04 / g++ compiler / boost v 1.35
Thanks in advance !
Second quick question I have doubts about:
Do you think it is possible to serialize my Particle structure ? With all the pointers it contains and the nested structures and the trees (TNode) it points to ...
------------------------------
Struct Particle{
ScanMatcherMap map;
OrientedPoint pose;
double weight;
double weightSum;
double gweight;
int previousIndex;
TNode* node;
};
typedef Map<PointAccumulator, HierarchicalArray2D<PointAccumulator>> ScanMatcherMap;
template <class Cell, class Storage, const bool isClass=true> class Map{
Point m_center;
double m_worldSizeX, m_worldSizeY, m_delta;
Storage m_storage;
int m_mapSizeX, m_mapSizeY;
int m_sizeX2, m_sizeY2;
static const Cell m_unknown;
};
struct PointAccumulator{
typedef point<float> FloatPoint;
PointAccumulator(): acc(0,0), n(0), visits(0){}
PointAccumulator(int i): acc(0,0), n(0), visits(0){assert(i==-1);}
static PointAccumulator* unknown_ptr;
FloatPoint acc;
int n, visits;
};
template <class Cell> class HierarchicalArray2D: public Array2D<autoptr< Array2D<Cell> > >{
typedef std::set< point<int>, pointcomparator<int> > PointSet;
HierarchicalArray2D(int xsize, int ysize, int patchMagnitude=5);
PointSet m_activeArea;
int m_patchMagnitude;
int m_patchSize;
};
template<class Cell, const bool debug=false> class Array2D{
Cell ** m_cells;
int m_xsize, m_ysize;
};
template <class X> class autoptr{
struct reference{
X* data;
unsigned int shares;
};
reference * m_reference;
};
struct TNode{
/**Constructs a node of the trajectory tree.
@param pose: the pose of the robot in the trajectory
@param weight: the weight of the particle at that point in the trajectory
@param accWeight: the cumulative weight of the particle
@param parent: the parent node in the tree
@param childs: the number of childs
*/
TNode(const OrientedPoint& pose, double weight, TNode* parent=0, unsigned int childs=0);
OrientedPoint pose;
double weight;
double accWeight;
double gweight;
TNode* parent;
const RangeReading* reading;
unsigned int childs;
mutable unsigned int visitCounter;
mutable bool flag;
};
class RangeReading: public SensorReading, public std::vector<double>{
std::vector<Point> cartesianForm(double maxRange=1e6) const;
unsigned int activeBeams(double density=0.) const;
OrientedPoint m_pose;
};