4

ブーストを使用して、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 エラーは表示されません。

4

1 に答える 1

1

上記のコメントを明確にするために

struct X {
    const Long rate;
}

が問題です。X がインスタンス化されると、rate は定数値に設定され、boost はそれを変更できません。代わりに

struct X {
    Long rate;
}

あなたのコードは機能しますか?

于 2014-02-23T00:12:55.780 に答える