When serializing a std::map (specifically, the loading part) if either the
key or value type of the map's pair is not default constructable then
workarounds are required (note: this has only been confirmed with the
std::map implementation provided with MSVC71).
E.g.:
{{{
#include
#include
#include
#include
#include <sstream>
#include <utility>
////////
// Example, non-default constructable class
class X
{
public:
X(int i) : i_(i) {}
private:
int i_;
friend class boost::serialization::access;
template <typename A>
void serialize(A &ar, const unsigned)
{}
};
template <typename A>
inline void load_construct_data(A &ar, X * a, const unsigned)
{
::new(a)X(1); // e.g.
}
//////////////////////////////////////////
void test_ser_pair()
{
std::map theMap;
theMap.insert(std::make_pair(0.5, X(1)));
std::string text;
{
std::ostringstream ostr;
boost::archive::text_oarchive arch(ostr);
arch & theMap;
text = ostr.str();
}
{
std::istringstream istr(text);
boost::archive::text_iarchive arch(istr);
// Next line doesn't compile under MSVC7.1 because the serialization
// of map uses the default constructor of std::pair.
arch & theMap;
}
}
}}}
My current workaround is to provide a specialization of just the std::pair
constructor for my map's pair, but it would be nice if the library could
provide a workaround.