boost::container::vector нельзя сериализовать с помощью Cereal?

Я пытаюсь сериализовать boost::container::vector<int> с помощью Cereal (я знаю, что boost предоставляет библиотеку сериализации, аналогичную Cereal, но весь проект использует Cereal, и есть только один его угол, который зависит от вектора повышения).

Я определил шаблонные функции save и load для boost::container::vector<int>, но Cereal терпит неудачу со статическим утверждением, сообщая, что не может найти пару функций сохранения/загрузки, функцию сериализации или пару функций save_minimal/load_minimal.

Вот простой код, демонстрирующий эту проблему. Для сравнения я также определил структуру шаблона myStruct, которая принимает аргументы шаблона того же типа, что и boost::container::vector, чтобы проверить, работает ли тот же код с моими собственными типами.

#include <cereal/archives/binary.hpp>
#include <sstream>
#include <boost/container/vector.hpp>

namespace bc = boost::container;

template<typename T, typename V = void, typename W = void>
struct myStruct {};

template<typename A>
void save(A& ar, const myStruct<int>& v) {}

template<typename A>
void load(A& ar, myStruct<int>& v) {}

template<typename A>
void save(A& ar, const bc::vector<int>& v) {}

template<typename A>
void load(A& ar, bc::vector<int>& v) {}

int main()
{
    std::stringstream ss;
    {
        cereal::BinaryOutputArchive oarchive(ss);
        bc::vector<int> myData;
        //myStruct<int> myData;
        oarchive(myData); 
    }
    {
        cereal::BinaryInputArchive iarchive(ss); 
        bc::vector<int> myData;
        //myStruct<int> myData;
        iarchive(myData); 
    }
}

РЕДАКТИРОВАТЬ: обратите внимание, что я также пытался переопределить CEREAL_SERIALIZE_FUNCTION_NAME, CEREAL_LOAD_FUNCTION_NAME и CEREAL_SAVE_FUNCTION_NAME перед включением каких-либо заголовков хлопьев, так как я думал, что методы save и load могут конфликтовать с функциями, предоставляемыми boost, но даже с переименованными функциями это не работает.


person sunmat    schedule 17.10.2019    source источник


Ответы (1)


Вы должны определить функции save/load в пределах namespace cereal или namespace boost::container.

person Armut    schedule 03.06.2021