2012-03-20 11 views
4

私はブーストシリアル化ライブラリを試しています。唯一の問題は、別の.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 –

答えて

8

あなたの問題はBoost.Serialization(そのようなもの)ではなく、関数テンプレートを個別にコンパイルしようとしています。

Class::serializeは、渡されるテンプレートパラメータの型に基づいてインスタンス化されることを意味する関数テンプレートです。 Class.cppをコンパイルするとき、コンパイラはClass::serializeがどのタイプでインスタンス化されるかを知らないので、コードを生成することができません。

+0

どのようにしてコンパイラにインスタンス化されるのかを教えてください。それとも私はできないのですか? – adamk33n3r

+0

@ adamk33n3r:良い質問です! 'template void Class :: serialize (boost :: archive :: text_oarchive&ar、const unsigned int);'で明示的にインスタンス化することができます。 – Mankarse

+0

ありがとう!あなたは脳のメルトダウンセーバーです!私はしばらくこのことを理解しようとしてきました。 – adamk33n3r

関連する問題