2016-04-27 7 views
3

So bin ich legit verwirrt. Es wird nicht für eine externe Serialisierungsfunktion kompiliert. Es gibt den FehlerGetreide Serialisierungsfehler

Getreide konnte keine Ausgabe Serialisierungsfunktionen für die bereitgestellten Typ und Archiv Kombination finden.

So unterhalb der Code nicht kompiliert

#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; 
} 

aber

#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; 
} 

ich buchstäblich kopieren und klebte das von GLM speichern Code nicht kompilieren :: vec3 zu etwas und gerade geändert glm :: vec3 zu 'etwas'. Es macht für mich keinen Sinn, warum es für eins und nicht für das andere funktionieren würde. Ich denke, es könnte eine Namespace-Sache sein, aber ich habe keine Ahnung, wie ich das beheben kann.

Antwort

4

Nun offenbar Posting machte mich die Lösung zu finden.

Sie müssen sicherstellen, dass die serialize Funktionen den gleichen Namensraum teilen, so dass, wenn ich sie wickeln wie

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)); 
} 
} 

Es funktioniert. Irgendwie seltsam, aber es ist was es ist.

Verwandte Themen