Boost logo

Boost Users :

From: Robert Ramey (ramey_at_[hidden])
Date: 2006-08-24 16:39:03


Dan Bikel wrote:
> The following tiny program generates two compiler errors on FC 5
> (which comes with g++ 4.1.1 and boost 1.33.1):
>
> #include <iostream>
> #include <fstream>
> #include <string>
> #include <boost/archive/text_oarchive.hpp>
> #include <boost/archive/text_iarchive.hpp>
> #include <boost/serialization/string.hpp>
>
> using namespace std;
> using namespace boost;
>
> int
> main(int argc, char **argv) {
> string * pFoo = new string("foo");
> ofstream ofs("strfile");
> {
> archive::text_oarchive oa(ofs);
> oa << pFoo;
> }
> }
>
> Error No. 1:
> /usr/include/boost/archive/detail/oserializer.hpp:567: error: invalid
> application of -1òøsizeofòù to incomplete type
> òøboost::STATIC_ASSERTION_FAILURE<false>
>
> Error No. 2:
> /usr/include/boost/serialization/access.hpp:109: error: -1òøstruct
> std::basic_string<char, std::char_traits<char>, std::allocator<char>
>> òù has no member named òøserializeòù
>

> Error No. 1 can be fixed by making pFoo a const pointer type, i.e., by
> changing the declaration/assignment statement to be
> string *const pFoo = new string("foo");
>
> I cannot figure out why such a change is necessary, as the
> serialization library documentation does not indicate that it is
> necessary to make pointers const in order to serialize them (as is
> borne out by the demo.cpp code).

This is explained in the "Rationale" section of the documentation.

> Also, I cannot figure out how to fix Error No. 2.
>
> Any help would be much appreciated!

The following program compiles. The problem is that std::string
is marked with a "primitive" serialization trait. It's the only
non built-in type so marked. Pointers to primitive types
cannot be serialized. The standard advice is to use
BOOST_STRONG_TYPEDEF to make a divferently
named version of the same type. This doesn't work
for string - so I made the same thing in this example.
There are other ways to do this - e.g. casting - but this
should give you the idea

#include <iostream>
#include <fstream>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/string.hpp>
using namespace std;
using namespace boost;
class serializable_string : public string {
friend class serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version){
ar & static_cast<string &>(*this);
}
public:
serializable_string(const char * s) :
string(s)
{
}
};
int
main(int argc, char **argv) {
serializable_string * const pFoo = new serializable_string("foo");
ofstream ofs("strfile");
{
archive::text_oarchive oa(ofs);
oa << pFoo;
}
}

>
> Thanks,
> Dan.


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