0

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' の引数として許可されていません

これを試みたのは私が初めてではないことは確かですが、ドキュメントやコード スニペットで具体的な解決策を見つけることができませんでした。

4

1 に答える 1

0

ここで説明されているアプローチに従って、実用的なソリューションを見つけました: http://www.boost.org/doc/libs/1_46_1/libs/serialization/doc/pimpl.html

* の定義をB::serializeに移動 *使用するアーカイブのさまざまなインスタンス化すべてにB.cpp 追加B.cpp

問題を説明するチケット: https://github.com/USCiLab/cereal/issues/324

于 2016-08-01T13:04:11.757 に答える