
I am tearing my hair out over this, partly because I believe the code used to compile. I just can't see what the problem is. I enclose all the pertinent code as I cannot say which bits are irrelevant. There are two classes: ManagedArray which is an array of data without size or capacity data (this is stored elsewhere). PersistentManagedArray which I wrote to enable ManagedArrays to be serialized. The error message is produced in 'main': error: no match for 'operator<<' in 'oa << PersistentManagedArray<int>((* & size), (* & capacity), (* & ints))' It seems to me that I have defined the necessary serialize member function with the right signature. Commented out is code I wrote some time ago which used separate load and save functions. This, I believe, used to work. #include <fstream> #include <boost/archive/binary_oarchive.hpp> #include <boost/archive/binary_iarchive.hpp> #include <string> using namespace std; //**************************************************************************************************************************** template<class T> class ManagedArray { public: T *values; ManagedArray() { values = NULL; } ~ManagedArray() { if (values) { delete [] values; } } //Changes array size. If array grows, the new values are unintialized. void resize(unsigned oldSize, unsigned newSize) { if (oldSize==newSize) return; T *newValues = (newSize==0) ? NULL : new T[newSize]; if (oldSize!=0) { T *oldValue, *newValue; T *end = values + (oldSize<newSize ? oldSize : newSize); for(oldValue=values, newValue=newValues; oldValue<end; oldValue++, newValue++) { *newValue = *oldValue; } } if (values) { delete [] values; } values = newValues; } //Changes array size. If array grows, the new values are initialised to copies of a prototype, initValue. void resize(unsigned oldSize, unsigned newSize, T &initValue) { if (oldSize==newSize) return; T *newValues = (newSize==0) ? NULL : new T[newSize]; T *oldValue = values; T *newValue = newValues; if (oldSize!=0) { T *oldEnd = values + (oldSize<newSize ? oldSize : newSize); for(; oldValue<oldEnd; oldValue++, newValue++) { *newValue = *oldValue; } } T *newEnd = newValues + newSize; for(; newValue<newEnd; newValue++) { *newValue = initValue; } delete [] values; values = newValues; } inline T &operator[](unsigned index) { return values[index]; } inline const T &operator[](unsigned index) const { return values[index]; } }; //**************************************************************************************************************************** //This class helps to save a ManagedArray in a Boost archive // Usage: // ar & PersistentManagedArray(size, capacity, array); template<class T> class PersistentManagedArray { public: PersistentManagedArray(unsigned &size, unsigned &capacity, ManagedArray<T> &managedArray) : _size(size), _capacity(capacity), _managedArray(managedArray) {valueArrayExists = (_managedArray.values!=NULL);} private: unsigned &_size; unsigned &_capacity; ManagedArray<T> &_managedArray; bool valueArrayExists; friend class boost::serialization::access; // template<class Archive> // void save(Archive & ar, const unsigned int version) const { // ar & valueArrayExists; // if (valueArrayExists) { // for(unsigned i=0; i<_size; i++) { // ar & _managedArray.values[i]; // } // } // } // template<class Archive> // void load(Archive & ar, const unsigned int version) { // _managedArray.values = NULL; // ar & valueArrayExists; // if (valueArrayExists) { // _managedArray.resize(0, _capacity); // for(unsigned i=0; i<_size; i++) { // ar & _managedArray.values[i]; // } // } // } // BOOST_SERIALIZATION_SPLIT_MEMBER() template<class Archive> void serialize(Archive & ar, const unsigned int version) { ar & valueArrayExists; ar & _size; ar & _capacity; if (Archive::is_loading::value) { delete _managedArray.values; _managedArray.values = new T[_capacity]; } for(unsigned i=0; i<_size; i++) { ar & _managedArray.values[i]; } } }; int main(int argc, char *argv[]) { ManagedArray<int> ints; unsigned size; unsigned capacity; string fileName = "data.xxx"; ofstream file(fileName.c_str(), ios::out|ios::binary); if (file.good()) { boost::archive::binary_oarchive oa(file); oa << PersistentManagedArray<int>(size, capacity, ints); //This line does not compile ! } }