cerealPIMPL イディオムの使用に問題があります。
これは最小限の例です:
bh
#ifndef _B_H_
#define _B_H_
#include <memory>
#include "cereal/types/memory.hpp"
#include "cereal/archives/json.hpp"
struct BImpl;
class B
{
public:
B();
~B();
private:
std::unique_ptr<BImpl> _impl;
friend class cereal::access;
template <class Archive>
void serialize( Archive& ar )
{
ar( CEREAL_NVP( _impl ) );
}
};
#endif
b.cpp
#include "b.h"
struct BImpl
{
int b_i = 0;
private:
friend class cereal::access;
template <class Archive>
void serialize( Archive & ar )
{
ar(
CEREAL_NVP( b_i )
);
}
};
B::B() : _impl( new BImpl )
{
}
B::~B()
{
}
main.cpp
#include "b.h"
#include <fstream>
#include "cereal/archives/json.hpp"
using namespace std;
int main( int argc, char** argv )
{
B b1;
{
std::ofstream file( "out.json" );
cereal::JSONOutputArchive archive( file );
archive( CEREAL_NVP( b1 ) );
}
}
そして、最小限の例をコンパイルしようとしたときに MSVC 2015 Community Edition で発生するエラーは次のとおりです。
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\type_traits(428): エラー C2139: 'BImpl': 未定義のクラスは、コンパイラの組み込み型特性 '__is_polymorphic' の引数として許可されていません
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\type_traits(435): エラー C2139: 'BImpl': 未定義のクラスは、コンパイラの組み込み型特性 '__is_abstract' の引数として許可されていません
これを試みたのは私が初めてではないことは確かですが、ドキュメントやコード スニペットで具体的な解決策を見つけることができませんでした。