2017-03-03 3 views
0

私は値をロードしているコアデータ構造を持っています:それはベクトルのハッシュマップです。ただし、ベクターには構造体が含まれています。さらに、構造体はテンプレート型を使用します。ブースト::ベクトルのハッシュマップをシリアライズする方法は?

このデータ構造をシリアル化して定期的にディスクに保存する必要があります。その後、別のプログラムで、シリアライズされたデータ構造をロードする必要があります。

ここでは、簡素化された構造体のバージョンがあります。私はそれらを最小限に定義しますが、この裸の骨のバージョンに加えて、他のデータ項目(メンバー)があります。

#include<vector> 
#include<string> 
#include<map> 
#include<fstream> 
#include<stdlib.h> 
#include <boost/serialization/vector.hpp> 
#include <boost/serialization/map.hpp> 
#include <boost/archive/text_oarchive.hpp> 
using namespace std; 

template<typename T> 
struct DataUnit{ 
    size_t time; 
    string transaction_string; 
    T transaction;    
} 

template<typename T> 
struct DataStructure{ 
    map<string transaction_hash, vector<DataUnit<T>> > hashmap; 
    int max_transactions; 

    // I have a method to add stuff, but omitted for readability 
} 

私は、最初の構造体で開始DataUnitて、次のように修正:

template<typename T> 
struct DataUnit{ 
    size_t time; 
    string transaction_string; 
    T transaction; 
    template<class Archive> 
    void serialize(Archive & ar, const unsigned int version){ 
     ar & time; 
     ar & transaction; 
     ar & transaction_string; 
    } 
}; 

は最終的に、私は、データ構造をシリアル化する必要があります。しかし、私は次のコードでこれを実行します:

int main(){ 
    DataUnit<int> hi; 
    hi.time = time(NULL); 
    hi.transaction = 1; 
    hi.transaction_string = "world"; 
    return 0; 
} 

ブーストからエラーで世界が爆発します。私が知る限り、チュートリアルの例exactlyに従った。どのように私はこれらのオブジェクトをboost-serializeするのですか?

エラーの一部(しかし、私はそれが基本的なものではありません信じることはできませんので、多くがあります...):

In function `boost::archive::text_oarchive::text_oarchive(std::ostream&, unsigned int)

undefined reference to `boost::archive::text_oarchive_impl::text_oarchive_impl(std::ostream&, unsigned int)'

last error:

undefined reference to `boost::archive::archive_exception::~archive_exception()'

、それはそこから行く...しかし、私はドン」私は何が含まれていない参照してください...(boostはCygwin経由でインストールされました)...

(管理者としてコードを実行しています...私が出力しているテキストファイルは、 .theオブジェクトが正常に作成されています)。


現在、完全にアイデアのうち...(ブーストを再インストール、lboost_serializationをリンクしようとした)いいえアイデア私はコード^^^

+0

私はboostsライブラリの1つにリンクする必要があると思います。これはリンカエラーのようです。 –

+0

@KurtStutsmanありがとう。私は-lboost_serializationを試しました。私は他に何を試してみるか分かりません。可能なリンケージのリスティング/ドキュメンテーションをどこに見つけることができるか、あなたはどんな考えがありますか? – bordeo

+0

ビルドに使用しているコマンドは何ですか?質問にコマンドライン全体を追加できますか? –

答えて

1

から何かが欠けていた場合、問題は、ビルドコマンドであなたの依存関係のためであります好き。依存関係を使用するモジュールの後に依存関係をリストする必要があります。また、.hファイルをコンパイルしません。それらを使用する.cppファイルに含める必要があります。次のコマンドを試してください:

g++ -std=c++11 main.cpp hashmap_transaction.cpp -o run.exe -lboost_serialization 
+0

ok、これを試してみてください...現時点では、Cygwinのインストールではなく、tarからのブーストとビルドを再インストールします。 – bordeo

+0

@bordeoソースからのブーストやビルドの再インストールはサポートしません。今すぐビルドを中止して時間を節約することができます。 –

+0

@ n.m。私はそれが働いていると思う...しかし、あなたは正しかった。 – bordeo

関連する問題