2012-03-20 30 views
4

我正在试验boost序列化库,并且我已经完成了大部分工作。唯一的问题是,当我尝试序列化具有单独的.h和.cpp文件的对象时。当我编译使用这个命令:使用单独的.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)' 

这是在我的.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 

和我的.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; 
    } 

我试着把所有东西都放进去到一个.cpp,包括它,它工作得很好,所以我知道这是与.h包容。由于某种原因,它没有找到序列化函数?我想我可以使用一个.cpp而不是两个,但我真的很喜欢组织,我想用它来做一个大项目。 任何想法?提前致谢。

+0

http://www.parashift.com/c++-faq-lite/templates.html#faq-35.15 – 2012-03-20 22:24:42

回答

8

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

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

+0

那么,我该如何告诉编译器它将被实例化的类型?或者我可以不? – adamk33n3r 2012-03-20 22:41:49

+0

@ adamk33n3r:好问题!您可以使用'template void Class :: serialize (boost :: archive :: text_oarchive&ar,const unsigned int);'在.cpp文件中明确地创建它。 – Mankarse 2012-03-20 22:48:18

+0

非常感谢!你是一个大脑崩溃保护者!我一直在想这个问题。 – adamk33n3r 2012-03-20 22:56:10