как сериализовать карту со структурой - PullRequest
0 голосов
/ 09 февраля 2019

Я пытаюсь повысить сериализацию значения карты со структурой в качестве ключа, но я получаю ошибку ниже при компиляции моего кода:

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

Как мне удалить эту ошибку?

1 Ответ

0 голосов
/ 09 февраля 2019

Если вы хотите сериализовать определяемые пользователем типы, вам нужно добавить serialize шаблон функции в ваш класс.В этом методе вы указываете, какие элементы данных вашего класса сериализуются / восстанавливаются.

Поскольку шаблон функции-члена не может быть определен для локальных определений перемещений класса MyKey , MyValue из основная функция:

    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; только один раз, после того как вы построили карту:

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