我不知道为什么在尝试编译时出现此错误。我尝试添加几乎所有类型。我正在尝试序列化RegDoneEntry的集合。我知道序列化的电话不在这里,但我不能仅此而已。以下内容已更新以反映建议。

我现在得到的错误是


  严重性代码说明项目文件行抑制状态
  错误LNK2001无法解析的外部符号
  “公共:静态类std :: set,类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);
    }
};

最佳答案

RegDoneEntry也应该定义serialize方法。

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

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


接下来,您要创建RegDoneEntry对象集,但是没有RegDoneEntry类的operator<,将不会编译您的代码。
您还应该在RegDoneEntry的定义中添加此运算符

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


最后,您已将其设置为静态成员,但未在源代码中定义它,因此也应添加此行

std::set<RegDoneEntry> RegDoneList::mylist;

关于c++ - Cereal 找不到任何输出序列化功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48130466/

10-10 23:19