使用单独的.h和.cpp文件增强序列化

Ada*_*nan 5 c++ serialization boost header-files

我正在尝试使用boost序列化库,我已经完成了大部分工作.唯一的问题是当我尝试序列化具有单独的.h和.cpp文件的对象时.当我使用此命令编译时:

g++ boostSerialize.cpp Class.cpp -lboost_serialization
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

/tmp/cc8kbW6J.o: In function `void boost::serialization::access::serialize<boost::archive::text_oarchive, Class>(boost::archive::text_oarchive&, Class&, unsigned int)':
boostSerialize.cpp:(.text._ZN5boost13serialization6access9serializeINS_7archive13text_oarchiveE5ClassEEvRT_RT0_j[void boost::serialization::access::serialize<boost::archive::text_oarchive, Class>(boost::archive::text_oarchive&, Class&, unsigned int)]+0x25): undefined reference to `void Class::serialize<boost::archive::text_oarchive>(boost::archive::text_oarchive&, unsigned int)'
Run Code Online (Sandbox Code Playgroud)

这就是我的.h:

#ifndef CLASS_H
#define CLASS_H
#include <iostream>
#include <string>
#include <boost/serialization/access.hpp>

using namespace std;

class Class{

    friend class boost::serialization::access;
    int a,b,c;
    string stringy;
    template<class Archive>
        void serialize(Archive &ar, const unsigned int);
    public:
        Class(int ab, int bb, int cb);

};
#endif
Run Code Online (Sandbox Code Playgroud)

和我的.cpp:

#include <iostream>
#include "Class.h"

using namespace std;

Class::Class(int ab, int bb, int cb){
    a = ab;
    b = bb;
    c = cb;
    stringy = "Text";
}

template<class Archive>
    void Class::serialize(Archive &ar, const unsigned int){
        ar & a & b & c & stringy;
    }
Run Code Online (Sandbox Code Playgroud)

我尝试将所有内容仅放入.cpp并包含它并且它工作正常,所以我知道它与.h包含有关.由于某种原因,它没有找到序列化功能?我想我可以使用.cpp而不是两者但我真的很喜欢组织,我想将它用于一个大项目.有任何想法吗?提前致谢.

Man*_*rse 8

你的问题不是Boost.Serialization(因此),而是你试图单独编译一个函数模板.

Class::serialize是一个函数模板,这意味着它根据传递给的模板参数的类型进行实例化.编译时Class.cpp,编译器不知道Class::serialize将实例化哪些类型,因此无法生成代码.

  • 更好的(?)解决方案:将`serialize`方法的实现移动到标题中.这是所有模板的典型方法 - 它们的完整实现必须放在标题中. (3认同)