ブーストを使用して、C++ でクラスの一部をシリアライズすることを学んでいます。
インターフェイスに構造体があります。この構造体をこのようにシリアル化するために、boost serilaize 関数を使用します。
Interface.h
struct X {
const Long rate;
}
template <class Archive>
void serialize(Archive& ar, uint32 version)
{
ar & this->rate;
}
BOOST_CLASS_EXPORT(X);
これで、このヘッダーがメイン クラスで使用されます。main.cpp としましょう。このメイン クラスのヘッダーには、
Main.h
#include "Interface.h"
class Main {
// some stuff
template <class Archive>
void serialize(Archive& ar, uint32 version);
X x;
friend class boost::serialization::access;
};
template <class Archive>
void
Main::serialize(Archive& ar, uint32 version)
{
ar & x;
}
BOOST_CLASS_EXPORT_KEY(Main);
メイン.cpp
BOOST_CLASS_EXPORT_IMPLEMENT(Main);
このコードをコンパイルしようとすると、次のエラーが発生します。
C:\Users\boost1470_win64_vc90sp1\include\boost/archive/detail/check.hpp(162): エラー C2027: [ x=false ] での未定義の型 'boost::STATIC_ASSERTION_FAILURE' の使用
C:\Users\boost1470_win64_vc90sp1\include\boost/archive/detail/iserializer.hpp(577) : [ T= でコンパイルされている関数テンプレートのインスタンス化 'void boost::archive::detail::check_const_loading(void)' への参照を参照してくださいconst ロング
C:\Users\interfaces/Interface.h(12) : [ Archive=boost:: archive::text_iarchive, T=const Long ]
C:\Users\interfaces/Interface.h(17) : [ T=X ] でコンパイルされているクラス テンプレートのインスタンス化 'boost::archive::detail::extra_detail::guid_initializer' への参照を参照してください。
何がうまくいかないのか考えてみてください。私は後押しするのが初めてで、これがどのように機能するかを理解しています。
注: 構造体で long ではなく int を使用すると、boost::STATIC_ASSERTION_FAILURE エラーは表示されません。