
On 12/06/12 18:05, Robert Ramey wrote:
Max Moorkamp wrote:
/usr/local/include/boost/serialization/shared_ptr.hpp:155: error: ‘class boost::mpi::packed_skeleton_iarchive’ has no member named ‘reset’ Here is he key.
The serialization library has some special code to handle boosts beloved shared_ptr. This special code is found in boost/archive/shared_ptr_helper.hpp.
it is added in at the "last possible moment" via public inheritance. see "boost\archive\binary_iarchive.hpp". This adds a special function called "reset". It seems that MPI serialization doesn't add in this functionality - hence the compile error.
So the fix would be tweak the MPI serialization implementation to address this. It's not clear to me what this would entail.
Longer term - some day - would be to add the functionaliy of a "generic helper" which any serialization implementation could use to permit serialization of otherwise unserializable classes.
Robert Ramey
I see, looking at boost/mpi/packed_oarchive.hpp and boost/mpi/packed_iarchive.hpp I find class BOOST_MPI_DECL packed_iarchive : public iprimitive , public archive::detail::common_iarchive<packed_iarchive> , public archive::detail::shared_ptr_helper { and class BOOST_MPI_DECL packed_oarchive : public oprimitive , public archive::detail::common_oarchive<packed_oarchive> , public archive::detail::shared_ptr_helper { so that seems to be in order. Interestingly this: #include <iostream> #include <boost/shared_ptr.hpp> #include <boost/mpi.hpp> #include <boost/serialization/serialization.hpp> #include <boost/serialization/shared_ptr.hpp> class MyClass { private: double a; friend class boost::serialization::access; template<class Archive> void serialize(Archive & ar, const unsigned int version) { ar & a; } public: void SetA(double value) { a = value; } double GetA() { return a; } MyClass() { } virtual ~MyClass() { } }; int main(int argc, char *argv[]) { boost::mpi::environment env(argc, argv); boost::mpi::communicator world; boost::shared_ptr<MyClass> ClassPointer(new MyClass()); if (world.rank() == 0) { ClassPointer->SetA(5.0); } boost::mpi::broadcast(world, ClassPointer, 0); std::cout << "Rank: " << world.rank() << " " << ClassPointer->GetA() << std::endl; } compiles and works as expected. So it appears that the problem is not the serialization of shared_ptr as such, but only if it is a member of a class. Regards Max