1

ここに簡単なクラスがあります:

template <typename T>
class clDaughter
{
public:

  T*        __pData;
  uint16_t  __u16Size;

  clDaughter() [...]

  ~clDaughter() [...]

  clDaughter(uint16_t const ku16Size)
  {
    this->__pData = (T*)malloc(ku16Size * sizeof(T));
    this->__u16Size = ku16Size;
  }

  template<class Archive>
  void save(Archive & ar) const
  {
    ar(this->__u16Size);
    ar(cereal::binary_data(this->__pData, this->__u16Size * sizeof(T)));
  }

  template<class Archive>
  void load(Archive & ar)
  {
    uint16_t u16LoadedSize;
    ar(u16LoadedSize);

    this->__pData = (T*)malloc(u16LoadedSize * sizeof(T));
    this->__u16Size = u16LoadedSize;
    ar(cereal::binary_data(this->__pData, this->__u16Size * sizeof(T)));
  }
};

これは正常に動作しています。つまり、シリアライゼーションのインとアウトは問題なくテストされています。

ここでポリモーフィズムを使用したい場合に問題が発生します。このドーター クラスは、他の「ドーターのような」クラスと同様に、純粋な仮想マザー クラスから継承します。

class clDaugter_A : public clMother
{
  [...]
}
class clDaugter_B : public clMother
{
  [...]
}

CEREAL_REGISTER_TYPE(...)そして、マクロを使用して clDaughter クラスを登録したい場合、

CEREAL_REGISTER_TYPE(clDaugter_A<int>)   
CEREAL_REGISTER_TYPE(clDaugter_B<int>)

コンパイラがクラッシュする

「シリアルは、指定されたタイプとアーカイブの組み合わせの出力シリアル化関数を見つけることができませんでした」

配列をループでシリアル化すると(醜いスタイル) 、このbinary_data(...)方法に問題があるようです。__pData

for (u16Idx = 0;..;..)
{
  ar(this->__pData[u16Idx];
}

エラーは発生せず、正常に動作します。binary_data()と併用する場合のみCEREAL_REGISTER_TYPE()です。

私は何を取りこぼしたか ?

(質問を先取りするbinary_data()ために、ループよりも20〜30倍高速であり、ここで高速である必要があるため、使用したいと思います)

お手伝いありがとうございます

4

0 に答える 0