【问题标题】:Cereal could not find any Output serialization functionsCereal 找不到任何输出序列化函数
【发布时间】:2018-01-06 18:23:24
【问题描述】:

我不知道为什么我在尝试编译时收到此错误。我尝试添加几乎所有类型。我正在尝试序列化一组 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);
    }
};

【问题讨论】:

  • 您遇到什么错误?另外,`template void serialize(Archive & archive)` 成员有什么用?
  • 错误是“谷物找不到任何输出序列化函数”。模板是谷物所需要的。
  • 我遇到了同样的错误。原来 serialize 在我的类中被定义为私有方法,而不是公共方法。跟随教程:rubentorresbonet.wordpress.com/2014/08/25/…

标签: c++ cereal


【解决方案1】:

RegDoneEntry 类也应该定义 serialize 方法。

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

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

接下来,您要创建一组 RegDoneEntry 对象,但是如果没有 RegDoneEntry 类的operator&lt;,您的代码将不会被编译。 您还应该在 RegDoneEntry 的定义中添加此运算符

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

最后一件事,你已经设置为静态成员,但你没有在源代码中定义它,所以你也应该添加这一行

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

【讨论】:

  • 这很有帮助,但我还有一个错误。我会更新上面的代码
  • @Jeff mylist in RegDoneList 仍然是静态成员,您应该在 main.cpp 文件中的 RegDoneList myRegDoneList; 之前添加 std::set&lt;RegDoneEntry&gt; RegDoneList::mylist;。类的静态变量必须在源代码的.cpp文件中定义。
猜你喜欢
  • 1970-01-01
  • 2014-05-16
  • 2016-03-09
  • 1970-01-01
  • 2018-12-19
  • 2019-01-05
  • 2020-09-14
  • 2016-11-08
  • 2017-07-29
相关资源
最近更新 更多