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