I am using boost 1.41.0 and MS VS 2008.

I have been having trouble serializing a map which contains a int (key) and structure value.

I create a simple test app to aid in the discussion.  I am attempting to perform a non intrusive serialization of the structure.

I had in the past been able to serialize a map of <int,string> successfully, but now that the map is <int, non_intrusive> where non_intrusive is the name of my strut,  I get an error:

2>Windows-6.1\install\include\boost-1_41\boost/serialization/access.hpp(109) : error C2039: 'serialize' : is not a member of 'non_intrusive'

and the line in boost is:

    template<class Archive, class T>
    static void serialize(
        Archive & ar,
        T & t,
        const unsigned int file_version
    ){
        t.serialize(ar, file_version);
//        serialize( ar, t, file_version );
    }

Where if I change the line

        t.serialize(ar, file_version);

to
        serialize( ar, t, file_version );

and then it compiles.  Which of course I know I should not do, but only did so to see if I could get it to call my template specialization for my serialize code of my strut with out having to perform in intrusive serialization and agian was just a test to see if boost would call my serialize function.  I have revered this so fear not... this is not the problem.

namespace boost { namespace serialization {
template<class Archive>
void serialize( Archive& ar, non_intrusive& ni ){
  ar & ni.a;
}
  
which is of course wrapped in the boost::serialization namespace... full example below


I am guessing I have not done something correctly and I have been successful in the past as I said serializing structures, vectors, and maps.  This is the first time I tried to serialize a map with a struct.  I also converted my code (not the example) to use a vector of std::pair<int, non_intrusive> and got the same error.

Here is the full program listing  any help would be appreciated:

//-------------------------------------------------------------------------------------------
#include <string>
#include <fstream>
#include <algorithm>
#include <boost/filesystem.hpp>
#include <boost/filesystem/fstream.hpp>
#include <boost/serialization/utility.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/xml_iarchive.hpp>
#include <boost/serialization/string.hpp>
#include <boost/serialization/map.hpp>

struct non_intrusive{
  int id;
  std::string name;
};


typedef std::map<int, non_intrusive> a_map_t;


namespace boost { namespace serialization {


// Not sure if I need to do this bit, but I have seen references to this
// syntax on the web.
template<class Archive>
void serialize( Archive& ar, std::pair<int, non_intrusive> & ni_pair ){
    ar & std::pair<int, non_intrusive>( ni_pair );
}

template<class Archive>
void serialize( Archive& ar, non_intrusive& ni ){
  ar & ni.a;
}
   
}}


void save
(
 const a_map_t& map_var, const std::string& file_name
)
{
  boost::filesystem::path file_path = file_name;
  boost::filesystem::path pathstr = file_path.remove_leaf();
  if( pathstr != "" )
    boost::filesystem::create_directory( pathstr );
 
  std::ofstream ofs( file_name.c_str(), std::ios_base::out | std::ios_base::trunc);
 
  boost::archive::xml_oarchive xml(ofs);
  xml << BOOST_SERIALIZATION_NVP( map_var );
}

// +----------------------------------------------------------------------

a_map_t load(const std::string& file_name)
{
  a_map_t map_var;
  //    std::ifstream ifs(file_name.c_str(), std::fstream::binary | std::fstream::in);
  std::ifstream ifs(file_name.c_str() );
  if( !ifs )
    {
      non_intrusive od;
      od.id = -1;
      od.name = "unknown device";
     
      map_var.insert(
            a_map_t::value_type( 0, od ) );
     
      save( map_var, file_name );
     
    }else
    {
      boost::archive::xml_iarchive xml(ifs);
      xml >> BOOST_SERIALIZATION_NVP( map_var );
    }
  return map_var;
}


// +----------------------------------------------------------------------
int main( void ){

    a_map_t map;
    map = load("map.xml");
    save(map, "map.xm" );



}