boost :: mpi :: broadcast를 사용하여 기본 클래스 포인터를 통해 모든 노드에 파생 클래스를 보내려고합니다. 이렇게하려면 boost :: serialization 라이브러리를 사용하여 클래스를 serialize합니다. 그러나 내 코드는 컴파일되지 않으며 "class boost :: mpi :: packed_skeleton_iarchive '클래스에는'append '라는 멤버가 없으며 class boost :: mpi :: packed_skeleton_iarchive 클래스에는'reset '이라는 멤버가 없습니다. "Boost :: serialization과 boost :: mpi가 기본 클래스 포인터를 통해 파생 클래스를 브로드 캐스트합니다.
// Base.hpp
#include <boost/serialization/serialization.hpp>
class Base
{
public:
Base() {}
virtual ~Base() {}
virtual void foo() = 0;
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive& /*ar*/, const unsigned int /*version*/) {}
}
// Derived.hpp
#include <boost/serialization/serialization.hpp>
#include <boost/serialization/shared_ptr.hpp>
#include <boost/serialization/vector.hpp>
#include <boost/serialization/base_object.hpp>
#include <boost/serialization/export.hpp>
#include <boost/shared_ptr.hpp>
#include <vector>
#include "Base.hpp"
class Derived : public Base
{
public:
Derived(int param);
virtual ~Derived();
void foo();
private:
int param_;
std::vector<boost::shared_ptr> bar_;
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive& ar, const unsigned int /*version*/)
{
ar & param_;
ar & bar_;
ar & boost::serialization::base_object<Base>(*this);
}
}
namespace boost
{
namespace serialization
{
template<class Archive>
void load_construct_data(Archive& /*ar*/, Derived* d,
const unsigned int /*v*/)
{
::new(d) Derived(0);
}
}
}
BOOST_CLASS_EXPORT_KEY(Derived)
// Derived.cpp
#include "Derived.hpp"
Derived::Derived(int param) : param_(param) {}
Derived::~Derived(){}
Derived::foo()
{
// some stuff
}
BOOST_CLASS_EXPORT_IMPLEMENT(Derived)
// Main.cpp
#include <boost/mpi.hpp>
#include <boost/serialization/serialization.hpp>
#include <boost/shared_ptr.hpp>
#include "Derived.hpp"
int main(int argc, char* argv[])
{
boost::shared_ptr<Base> sp;
if (world.rank() == 0)
{
sp = boost::shared_ptr<Base>(new Derived(5));
boost::mpi::broadcast(world, sp, 0);
// produce some stuff
} else
{
while (1)
{
// consume some stuff
}
}
return 0;
}
BOOST_SERIALIZATION_ASSUME_ABSTRACT(Base)
나는이 문제에 있지만 해결책 지금까지 https://groups.google.com/forum/#!msg/boost-developers-archive/Ee9_ilEDO7s/cJTy-8v5lEcJ에 대한 하나의 Google 그룹 토론을 발견
다음은 프로그램의 대략적인 소스 코드입니다. 컴파일하려면 어떻게해야합니까? openmpi 1.2.8-17.4, gcc 4.5.1 및 1.54를 사용하고 있습니다.