I was trying out the new Boost 1.56 beta and some of my serialization code fails to compile (they work fine with previous versions of Boost e.g. Boost 1.55).I am trying to do serialization of Eigen (http://eigen.tuxfamily.org/) matrices with following code:#include <Eigen/Core>#include <fstream>#include <boost/serialization/vector.hpp>#include <boost/archive/binary_oarchive.hpp>#include <boost/archive/binary_iarchive.hpp>//Boost Serialization of Eigen Matrixnamespace boost {template<class Archive, typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>inline void serialize(Archive & ar,Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>& t,const unsigned int file_version) {size_t rows = t.rows(), cols = t.cols();ar & rows;ar & cols;if (rows * cols != t.size())t.resize(rows, cols);ar & boost::serialization::make_array(t.data(), t.size());}}
//Simple helper for serialization to a filetemplate <typename T>bool serialize(const T& data, const std::string& filename) {std::ofstream ofs(filename.c_str(), std::ios::out | std::ios::binary);if (!ofs.is_open())return false;{ // use scope to ensure archive goes out of scope before streamboost::archive::binary_oarchive oa(ofs);oa << data;}ofs.close();return true;}//Simple helper for de-serialization from a filetemplate <typename T>bool deSerialize(T& data, const std::string& filename) {std::ifstream ifs(filename.c_str(), std::ios::in | std::ios::binary);if (!ifs.is_open())return false;{ // use scope to ensure archive goes out of scope before streamboost::archive::binary_iarchive ia(ifs);ia >> data;}ifs.close();return true;}int main(int argc, char *argv[]) {typedef Eigen::Vector3d VectorType;VectorType* vec = new VectorType(1, 2, 3);serialize(vec, "v4d.dat");std::cout << "v4d =\n" << *vec << std::endl;VectorType* vec_in;deSerialize(vec_in, "v4d.dat");std::cout << "v4d_in =\n" << *vec_in << std::endl;return 0;}The error in Visual studio 2013 says:boost/archive/detail/iserializer.hpp(237): error C2665: 'Eigen::PlainObjectBase<Eigen::Matrix<double,3,1,0,3,1>>::operator delete' : none of the 3 overloads could convert all the argument types2> c:\users\abhijit\codes\installs\eigen\eigen-install\include\eigen3\eigen\src/Core/PlainObjectBase.h(132): could be 'void Eigen::PlainObjectBase<Eigen::Matrix<double,3,1,0,3,1>>::operator delete(void *,const std::nothrow_t &) throw()'2> c:\users\abhijit\codes\installs\eigen\eigen-install\include\eigen3\eigen\src/Core/PlainObjectBase.h(132): or 'void Eigen::PlainObjectBase<Eigen::Matrix<double,3,1,0,3,1>>::operator delete(void *,void *) throw()'2> while trying to match the argument list '(VectorType *, size_t)'2> C:\Boost\boost-1_56_0_b1\boost/archive/detail/iserializer.hpp(224) : while compiling class template member function 'void boost::archive::detail::heap_allocation<T>::has_new_operator::invoke_delete(T *)'There is also the following note, but I cannot seem to understand this.// if compilation fails here, the likely cause that the class// T has a class specific new operator but no class specific// delete operator which matches the following signature. Fix// your program to have this. Note that adding operator delete// with only one parameter doesn't seem correct to me since// the standard(3.7.4.2) says "// "If a class T has a member deallocation function named// 'operator delete' with exactly one parameter, then that function// is a usual (non-placement) deallocation function" which I take// to mean that it will call the destructor of type T which we don't// want to do here.I want to understand this issue because this breaks a lot of existing code.