Cereal не удалось найти функции сериализации вывода.

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

Ошибка, которую я получаю сейчас,

Код серьезности Описание Состояние подавления строки файла проекта Ошибка LNK2001 неразрешенный внешний символ "public: static class std::set,class std::allocator > RegDoneList::mylist" (?mylist@RegDoneList@@2V?$set@VRegDoneEntry@@U ?$less@VRegDoneEntry@@@std@@V?$allocator@VRegDoneEntry@@@3@@std@@A) CerealTest CerealTest.obj 1

#include "stdafx.h"
#include "cereal/archives/binary.hpp"
#include "cereal/types/set.hpp"
#include <sstream>
#include <iostream>
#include <fstream>
#include <string>
#include <set>
#include <stdio.h>
#include "test.h"

RegDoneList myRegDoneList;

int main()
{
    myRegDoneList = RegDoneList();

    myRegDoneList.mylist = std::set<RegDoneEntry>();
    std::ofstream ss("c:\\reg.bin", std::ofstream::binary | 
        std::ofstream::out | std::ofstream::trunc);

    cereal::BinaryOutputArchive oarchive(ss);
    oarchive(myRegDoneList); // Write the data to the archive

}

bool operator<(const RegDoneEntry& lhs, const RegDoneEntry& rhs)
{
    return lhs.rawData < rhs.rawData;
}

И файл заголовка:

#include "stdafx.h"
#include "cereal/archives/binary.hpp"
#include "cereal/types/memory.hpp"
#include <sstream>
#include <iostream>
#include <fstream>
#include <string>
#include <set>
#include <stdio.h>


class RegDoneEntry
{
public:
    std::string rawData;
    int operation;
    template<class Archive>
    void serialize(Archive & archive)
    {
        // serialize things by passing them to the archive
        archive(rawData, operation);
    }
    friend bool operator< (const RegDoneEntry &left, const RegDoneEntry &right);

};


class RegDoneList
{
public:
    static std::set<RegDoneEntry> mylist;
    template<class Archive>
    void serialize(Archive & archive)
    {
        // serialize things by passing them to the archive
        archive(mylist);
    }
};

person Jeff    schedule 06.01.2018    source источник
comment
Какую ошибку вы получаете? Кроме того, какая польза от члена `template‹class Archive› void serialize(Archive & archive)`?   -  person MKR    schedule 06.01.2018
comment
Ошибка заключается в том, что Cereal не может найти никаких функций сериализации вывода. шаблон - это то, что требует крупа.   -  person Jeff    schedule 06.01.2018
comment
У меня была такая же ошибка. Оказывается, сериализация была определена в моем классе как частный метод, а не общедоступный. Следовал руководству: rubentorresbonet .wordpress.com/2014/08/25/   -  person ワイきんぐ    schedule 28.01.2021


Ответы (1)


В классе RegDoneEntry также должен быть определен метод serialize.

struct RegDoneEntry
{
  std::string rawData;
  int operation;

  template<class Archive>
  void serialize (Archive& ) {  //... 
  } 
};

Далее вы хотите создать набор объектов RegDoneEntry, но ваш код не будет скомпилирован без operator< для класса RegDoneEntry. Вы также должны добавить этот оператор в определение RegDoneEntry.

struct RegDoneEntry {
   // ...code from above
   bool operator < (const RegDoneEntry& ) const {
       // your comparison
   }
};

И последнее, вы установили статический член, но не определили его в исходном коде, поэтому вам следует добавить и эту строку.

std::set<RegDoneEntry> RegDoneList::mylist;
person rafix07    schedule 06.01.2018
comment
Это очень помогает, но у меня осталась одна ошибка. Я обновлю код выше - person Jeff; 06.01.2018
comment
@Jeff mylist в RegDoneList по-прежнему является статическим членом, вы должны добавить std::set<RegDoneEntry> RegDoneList::mylist; перед RegDoneList myRegDoneList; в файле main.cpp. Статическая переменная класса должна быть определена в .cpp файле исходного кода. - person rafix07; 06.01.2018