gpt4 book ai didi

c++ - 如何使用结构序列化 map

转载 作者:行者123 更新时间:2023-11-28 04:24:50 41 4
gpt4 key购买 nike

我正在尝试使用 struct 作为键来 boost 映射值的序列化,但在编译我的代码时出现以下错误:

/usr/include/boost/serialization/access.hpp:116:11: error: ‘struct main(int, char**)::MyKey’ has no member named ‘serialize’
t.serialize(ar, file_version);

这是我使用的主要代码:

#include <ros/ros.h>

#include <map>
#include <fstream>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/map.hpp>

int main (int argc, char** argv)
{
ros::init (argc, argv, "training");
ros::NodeHandle nh;

struct MyKey {
int d0, d1, d2, a0, b0, a1, b1, a2, b2;

bool operator < (const MyKey& o) const {
return std::tie(d0, d1, d2, a0, b0, a1, b1, a2, b2) < std::tie(o.d0, o.d1, o.d2, o.a0, o.b0, o.a1, o.b1, o.a2, o.b2);
}
};

struct MyValue {
int p0, p1, p2;
};

std::map<MyKey, MyValue> pobj;

std::ofstream s("obj_pattern"); boost::archive::text_oarchive oa(s);
for(int i=0;i<5000000;i++) {
pobj.insert({{i, i+1, i+2, i+3, i+4, i+5, i+6, i+7, i+8}, {i+9, i+10, i+11}});
oa << pobj;
}

return 0;
}

如何消除这个错误?

最佳答案

如果您想序列化用户定义的类型,您需要将serialize 函数模板添加到您的类中。在此方法中,您声明类的哪些数据成员被序列化/恢复。

因为不能为局部类定义成员函数模板,将 MyKeyMyValue 的定义移出 main 函数:

    struct MyKey {
int d0, d1, d2, a0, b0, a1, b1, a2, b2;

bool operator < (const MyKey& o) const {
return std::tie(d0, d1, d2, a0, b0, a1, b1, a2, b2)
< std::tie(o.d0, o.d1, o.d2, o.a0, o.b0, o.a1, o.b1, o.a2, o.b2);
}

template<class Ar>
void serialize (Ar& ar, const unsigned int) {
ar & d0;
ar & d1;
// ditto
}
};

struct MyValue {
int p0, p1, p2;

template<class Ar>
void serialize(Ar& ar, const unsigned int) {
ar & p0;
ar & p1;
//
}
};


int main (int argc, char** argv)
{
//...
}

你应该调用oa << pobj;只有一次,在你构建 map 之后:

    for(int i=0;i<5000000;i++) {
pobj.insert({{i, i+1, i+2, i+3, i+4, i+5, i+6, i+7, i+8}, {i+9, i+10, i+11}});
}
oa << pobj;

关于c++ - 如何使用结构序列化 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54603316/

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