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

C++ 使用单独的.h和.cpp文件增强序列化,c++,serialization,boost,header-files,C++,Serialization,Boost,Header Files,我正在试验boost序列化库,我已经使它的大部分工作正常。唯一的问题是当我尝试序列化一个有单独的.h和.cpp文件的对象时。使用此命令编译时: g++ boostSerialize.cpp Class.cpp -lboost_serialization 我得到这个错误: /tmp/cc8kbW6J.o: In function `void boost::serialization::access::serialize<boost::archive::text_oarchive, Clas

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

g++ boostSerialize.cpp Class.cpp -lboost_serialization
我得到这个错误:

/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)'
/tmp/cc8kbW6J.o:void boost::serialization::access::serialization(boost::archive::text_oarchive&,Class&,unsigned int)函数中:
boostSerialize.cpp:(.text.\u zn5boost13序列化6access9serializeins\u 7archive13text\u oarchive5classeevrt\u RT0\u j[void boost::serialization::access::serialize(boost::archive::text_oarchive&,Class&,unsigned int)]+0x25):对“void Class::serialize(boost::archive::text_oarchive&,unsigned int)”的未定义引用
这是my.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
#如果是H类
#定义类
#包括
#包括
#包括
使用名称空间std;
班级{
好友类boost::serialization::access;
INTA、b、c;
细绳;
模板
无效序列化(存档&ar,常量unsigned int);
公众:
类别(内部ab、内部bb、内部cb);
};
#恩迪夫
和my.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;
    }
#包括
#包括“h类”
使用名称空间std;
类::类(int ab、int bb、int cb){
a=ab;
b=bb;
c=cb;
stringy=“Text”;
}
模板
void类::序列化(存档&ar,常量unsigned int){
ar&a&b&c&stringy;
}
我试着把所有的东西都放在一个.cpp中,并包含在其中,结果很好,所以我知道这和.h包含有关。出于某种原因,它找不到serialize函数?我想我可以用一个.cpp来代替两者,但我真的很喜欢组织,我想在一个大项目中使用它。
有什么想法吗?提前感谢。

您的问题不在于Boost.Serialization(本身),而在于您试图单独编译函数模板


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

那么,我如何告诉编译器将使用哪些类型来实例化它呢?还是我不能?@adamk33n3r:好问题!您可以使用
模板void Class::serialize(boost::archive::text\u oarchive&ar,const unsigned int)在.cpp文件中显式实例化它。非常感谢!你是一个头脑崩溃的救星!我一直在努力解决这个问题。更好的(?)解决方案:将
serialize
方法的实现移到头中。这是所有模板的典型方法-它们的完整实现必须放在标题中。