gpt4 book ai didi

c++ - 麦片序列化错误

转载 作者:太空狗 更新时间:2023-10-29 20:22:40 26 4
gpt4 key购买 nike

所以我很困惑。它不会为外部序列化函数编译。它给出了错误

cereal could not find any output serialization functions for the provided type and archive combination.

所以下面的代码不能编译

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

但这确实编译

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

我从字面上将保存代码从 glm::vec3 复制并粘贴到 something,然后将 glm::vec3 更改为“something”。对我来说,为什么它适用于一个而不适用于另一个对我来说毫无意义。我认为这可能是命名空间的问题,但我不知道如何解决。

最佳答案

显然发帖让我找到了解决方案。

你需要确保序列化函数共享相同的命名空间,所以如果我像这样包装它们

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

它有效。有点奇怪,但事实就是如此。

关于c++ - 麦片序列化错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36889598/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com