C++ C++;谷物保存/加载_和_构造不工作

C++ C++;谷物保存/加载_和_构造不工作,c++,cereal,C++,Cereal,所以我试图使用图书馆,我遇到了一个我似乎无法克服的问题。从本质上讲,医生说可以反序列化。然而,在实现说明中,它说,像通常那样定义序列化或保存/加载对,但是如果没有默认构造函数,则无法以有效的方式定义序列化/加载选项。我认为这意味着,load\u和_-construct函数取代了load。然而,当实现下面一个相对简单的示例时 “main.cpp” #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 结构字符串包装器{ 常量std::字符串str; 字符串包装器(cons

所以我试图使用图书馆,我遇到了一个我似乎无法克服的问题。从本质上讲,医生说可以反序列化。然而,在实现说明中,它说,
像通常那样定义序列化或保存/加载对
,但是如果没有默认构造函数,则无法以有效的方式定义序列化/加载选项。我认为这意味着,
load\u和_-construct
函数取代了
load
。然而,当实现下面一个相对简单的示例时

“main.cpp”

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
结构字符串包装器{
常量std::字符串str;
字符串包装器(const std::string&_a):str{{u a}{}
模板
无效保存(存档和_存档)常量{
_档案馆(str);
}
模板
静态无效加载和构造(存档和存档,
谷物::构造&_构造){
std::字符串a;
_档案(a);
_建造(a);
}
};
字符串包装器的结构包装器{
常数std::向量str;
字符串的包装器(
常数std::向量和
):strs{{u a}{}
模板
无效保存(存档和_存档)常量{
_档案(strs);
}
模板
静态无效加载和构造(存档和存档,
谷物::构造&_构造){
std::载体strs;
_档案(strs);
_建造(strs);
}
};
int main(){
auto file=“test.bin”;
{//save
流操作系统的std::of(文件,std::ios::binary);
PortableBinaryOutputArchiveSave(os);
std::向量as;
as.push_back({“Hello”});
as.推回({“世界”});
字符串的包装器测试(as);
自动测试\u ptr=std::使\u唯一(测试);
archiveSave(测试存储);
}
{//装载
ifstream是(文件,std::ios::binary);
谷物:便携式二进制输入存档(is);
std::unique_ptr test=nullptr;
archiveLoad(测试);
std::coutFrom

非默认构造函数当前仅支持序列化指针

这里的问题是,您试图序列化非指针值,但这里没有默认构造函数

std::vector<string_wrapper> strs;
_archive(strs);

我无法用最新的谷物代码重现您的错误。您使用的是哪个版本?@miradham 1.2.2,目前官方网站上最新的版本。@miradham我已在我的原始帖子中添加了其他信息。请提供,以便其他人可以帮助you@miradham我已经重写了我的示例代码,这给出了完全相同的行为vior和应该很容易运行。啊,好的,我认为std::vector会被当作一个指针来对待,所以我认为这不会是一个问题。谢谢你澄清这一点。
std::vector<string_wrapper> strs;
_archive(strs);
struct wrapper_of_string_wrappers {
    //const std::vector<std::unique_ptr<string_wrapper>> strs;
    //const string_wrapper strs;
    const std::unique_ptr<string_wrapper> strs;

    wrapper_of_string_wrappers(
        //const std::vector<std::unique_ptr<string_wrapper>>& _a
        const string_wrapper _a
    ) : strs{ new string_wrapper(_a) } { }

    wrapper_of_string_wrappers(
        const wrapper_of_string_wrappers& w
    ) : strs{ new string_wrapper(*w.strs) } { }

    template <class Archive>
    void save(Archive& _archive) const {
        _archive(strs);
    }

    template <class Archive>
    static void load_and_construct(Archive& _archive,
        cereal::construct<wrapper_of_string_wrappers>& _construct) {
        //std::vector<std::unique_ptr<string_wrapper>> strs;
        std::unique_ptr<string_wrapper> strs;
        _archive(strs);
        _construct(*strs);
    }
};

int main() {

    auto file = "test.bin";
    { // save
        std::ofstream os(file, std::ios::binary);
        cereal::PortableBinaryOutputArchive archiveSave(os);

        string_wrapper as("Hello");
        wrapper_of_string_wrappers test(as);

        auto test_ptr = std::make_unique<wrapper_of_string_wrappers>(test);
        archiveSave(test_ptr);
    }

    { // load
        std::ifstream is(file, std::ios::binary);
        cereal::PortableBinaryInputArchive archiveLoad(is);
        std::unique_ptr<wrapper_of_string_wrappers> test = nullptr;
        archiveLoad(test);
        std::cout << (*test).strs->str << std::endl;
    }

    std::cin.get();

    return 0;
}