2016-04-27 9 views
3

私は正当な理由で混乱しています。外部のシリアライゼーション機能ではコンパイルされません。エラーが発生する穀物のシリアル化エラー

で提供されているタイプとアーカイブの組み合わせでシリアルが見つかりませんでした。

ので、以下のコードは、

#include <fstream> 
#include <glm/glm.hpp> 
#include "SceneObject.h" 
#include <cereal/cereal.hpp> 
#include <cereal/archives/json.hpp> 

template<typename Archive> void serialize(Archive& archive, glm::vec3& v3) 
{ 
    archive(cereal::make_nvp("x", v3.x), cereal::make_nvp("y", v3.y), cereal::make_nvp("z", v3.z)); 
} 

struct something 
{ 
public: 
    float x, y, z; 
}; 
template<typename Archive> void serialize(Archive& archive, something& v3) 
{ 
    archive(cereal::make_nvp("x", v3.x), cereal::make_nvp("y", v3.y), cereal::make_nvp("z", v3.z)); 
} 

int main(int argc, char** argv) 
{ 
    SceneObject test; 
    test.transform().setPosition(1.0f,2.0f,3.0f); 

    { 
     std::ofstream file("TestPath.json"); 
     cereal::JSONOutputArchive output(file); 
     glm::vec3 p = test.transform().getPosition(); 
     output(p); 
    } 

    return 0; 
} 

をコンパイルしていませんが、これは、私は文字通りコピーして、何かにGLMからのコードを保存する:: vec3を貼り付けるだけ変更

#include <fstream> 
#include <glm/glm.hpp> 
#include "SceneObject.h" 
#include <cereal/cereal.hpp> 
#include <cereal/archives/json.hpp> 

template<typename Archive> void serialize(Archive& archive, glm::vec3& v3) 
{ 
    archive(cereal::make_nvp("x", v3.x), cereal::make_nvp("y", v3.y), cereal::make_nvp("z", v3.z)); 
} 

struct something 
{ 
public: 
    float x, y, z; 
}; 
template<typename Archive> void serialize(Archive& archive, something& v3) 
{ 
    archive(cereal::make_nvp("x", v3.x), cereal::make_nvp("y", v3.y), cereal::make_nvp("z", v3.z)); 
} 

int main(int argc, char** argv) 
{ 
    SceneObject test; 
    test.transform().setPosition(1.0f,2.0f,3.0f); 

    { 
     std::ofstream file("TestPath.json"); 
     cereal::JSONOutputArchive output(file); 
     glm::vec3 p = test.transform().getPosition(); 
     something s; 
     s.x = p.x; 
     s.y = p.y; 
     s.z = p.z; 
     output(s); 
    } 

    return 0; 
} 

をコンパイルDOES glm :: vec3を「何か」に変換します。それは私には意味がありません。私はそれが名前空間のものかもしれないと思うが、私はそれを修正する方法を知りません。

答えて

4

よく明らかに投稿すると解決策が見つかりました。

あなたはそれが動作する

namespace glm 
{ 
template<typename Archive> void serialize(Archive& archive, glm::vec3& v3) 
{ 
    archive(cereal::make_nvp("x", v3.x), cereal::make_nvp("y", v3.y), cereal::make_nvp("z", v3.z)); 
} 
} 

ように私はそれらを包み込むかのように、シリアル化機能は、同じ名前空間を共有することを確認する必要があります。奇妙なことだけど、それはそうだ。

関連する問題