私はboost::serialization
自分のプロジェクトで使用しています。プロジェクトは大規模で、オブジェクトをいくつかの場所でシリアル化します。ここのドキュメントによると、2つの別々のステップでクラスをエクスポートする必要があります。
BOOST_EXPORT_KEY()
.h
ファイルでは、witchに宣言が含まれています。BOOST_EXPOET_IMPLEMENT()
ファイルで.cpp
は、witchにはエクスポートのインスタンス化(定義)が含まれています。
hier.h
クラス階層では、階層には3つのクラスがあります。
/*
B <---+--- D1
|
+--- D2
*/
#include <boost/serialization/base_object.hpp>
class B {
public:
virtual ~B() {}
template < typename Ar >
void serialize(Ar& ar, const int) {
}
} ;
class D1 : public B {
public:
virtual ~D1() {}
template < typename Ar > void serialize(Ar& ar, const int) {
boost::serialization::base_object<B>(*this);
}
} ;
class D2 : public B {
public:
template < typename Ar > void serialize(Ar& ar, const int) {
boost::serialization::base_object<B>(*this);
}
virtual ~D2() {}
} ;
#include <boost/serialization/export.hpp>
BOOST_CLASS_EXPORT_KEY(B);
BOOST_CLASS_EXPORT_KEY(D1);
BOOST_CLASS_EXPORT_KEY(D2);
そして、ahier.cpp
には実装が含まれています:
#include <boost/serialization/export.hpp>
#include "hier.h"
BOOST_CLASS_EXPORT_IMPLEMENT(D1);
BOOST_CLASS_EXPORT_IMPLEMENT(D2);
そしてmain.cpp
、シリアル化を使用します。
#include <iostream>
#include <sstream>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/serialization/export.hpp>
#include "hier.h"
int main(int argc, char* argv[])
{
B* d1 = new D1();
B* d2 = new D2();
std::ostringstream os;
boost::archive::text_oarchive oa (os);
oa & d1 & d2;
}
問題なくコンパイルされましたが、実行すると次のようになります。
terminate called after throwing an instance of 'boost::archive::archive_exception'
what(): unregistered class - derived class not registered or exported
これは、派生クラスが登録されていないことを意味し、の登録が機能してhier.cpp
いないことを意味します。しかし、それは本当に奇妙です。なぜなら、次の理由からです。
実装がとの両方であると登録する
main.cpp
とhier.cpp
、リンク中に重複した定義が発行されます。での登録がOKであり、リンカーの可視性に公開されていることを意味します。hier.cpp
、それ以外の場合、重複した定義エラーは発生しません。にのみ実装を登録すれば
main.cpp
OKです。
私はその状況で本当に混乱しています。コメントや提案をいただければ幸いです。前もって感謝します。