5

編集:質問のタイトルは、私が得たコンパイラ エラーの深い誤解に基づいていました。私は(ばかげて)エラーが、関数内で宣言したオブジェクトに逆シリアル化しようとしたと仮定していました。これは完全に間違っていました。自分で十分なデバッグ作業を行っていないか、何が問題なのかを突き止めることができたはずです。そのため、タイトルがかなり誤解を招くものだったので、変更しました。助けてくれた Андрей Беньковский に感謝します。


私は、シリアルを使用してエンジンで 3D モデルのシリアル化関数を作成しています。これは、非常に効率的で使いやすいことが証明されています。これまでのところ、単純なメッシュのシリアル化 (逆) をテストしたところ、すべてうまくいきました。しかし、今、別のクラスを逆シリアル化しようとしていますが、問題が発生しました。

void loadFile(std::string filepath)
{
    DescriptionFile file;

    {
        ifstream stream = ifstream(filepath, std::ifstream::binary);
        PortableBinaryInputArchive archive(stream);
        archive(file);
        stream.close();
    }
}

これは私のクラスで、逆シリアル化する必要があります:

struct DescriptionFile 
{
public:
    DescriptionFile(){}

    map<string, MeshDescription*> meshDescriptions;
    map<string, ModelDescription*> modelDescriptions;

public:
    template<class Archive>
    void serialize(Archive & archive)
    {
        archive(meshDescriptions, modelDescriptions);
    }
};

それは私にコンパイラエラーを与えます:Cerealは生のポインターのシリアル化をサポートしていません-それはポインターではありませんが、スマートポインターを使用してください。コードの別の部分では、同様のことがうまく機能します。誰かがこれを解決するのを手伝ってくれたらうれしいです。

4

1 に答える 1

3

私はシリアルを使用したことはありませんが、次のようなものを使用することを期待しているようです:

map<string, unique_ptr<MeshDescription> >

std::unique_ptrを取得するには、通常#include <memory>

シリアルのドキュメントから:

cereal は、スマート ポインターのシリアル化をサポートしていますが、ダム ポインター (つまり、 などの生のポインターint *) または参照はサポートしていません。ポインターのサポートは、 を含めることで見つけることができます<cereal/types/memory.hpp>

標準の代わりにヘッダーを含める必要があることを意味している可能性があります。

PSオブジェクトがリソースを所有している場合(動的に割り当てられMeshDescriptionているなど)、常にリソース管理(割り当て、割り当て解除、コピーなど)を別のクラス(スマートポインター、コレクション、ラッパーなど)に委任します。0 のルールを参照してください。

于 2015-10-26T12:14:54.967 に答える