2012-04-12 2 views
0

私はプログラミングとC++を初めて使い、この問題に遭遇したようです。structでboost :: serializeを宣言して別の構造体にする

私は様々なセンサーオフセットを持つ設定ファイルを作成し、boost :: serialization loadを使って他のクラスが読むことができるxmlとして保存しています。

すべてのセンサーに同じ種類のオフセットがあるため、オフセット定義を持つ汎用構造体を作成したいと考えています。私はシリアライズして保存/一般的なstuctにロードし、必要なときにのみ別の構造体でインスタンス化したいと思います。

各センサーは独自の構造体を持っているので、他のクラスは必要なセンサー構造体を使うだけです。

元々、私は各センサー構造体にserialize/save/loadを持っていましたが、正常に動作しました。しかし、これを汎用構造体に移動した後、私はそれを呼び出すことができないようです。

コードは次のとおりです。

10 #pragma once 
11 #ifndef OFFSET_CONFIG_H 
12 #define OFFSET_CONFIG_H 
13 
14 #include <boost/archive/xml_oarchive.hpp> 
15 #include <boost/archive/xml_iarchive.hpp> 
16 #include <boost/serialization/nvp.hpp> 
17 #include <fstream> 
18 #include <string> 
19 
20 typedef struct Offset 
21 { 
22  std::string name;   // Offsets type. 
23  double offsetX; 
24  double offsetY; 
25  double offsetZ; 
26  double roll; 
27  double pitch; 
28  double yaw; 
29 
30  template<class Archive> 
31  void serialize(Archive & ar, const unsigned int version) 
32  { 
33   using boost::serialization::make_nvp; 
34   ar & make_nvp("offsetType", name); 
35   ar & make_nvp("OffsetX", offsetX); 
36   ar & make_nvp("OffsetY", offsetY); 
37   ar & make_nvp("OffsetZ", offsetZ); 
38   ar & make_nvp("Roll", roll); 
39   ar & make_nvp("Pitch", pitch); 
40   ar & make_nvp("Yaw", yaw); 
41  } 
42 
43  void save(const std::string& filename) 
44  { 
45   std::fstream ofs(filename.c_str(), std::fstream::trunc | std::fstream::out); 
46   boost::archive::xml_oarchive xml(ofs); 
47   xml << boost::serialization::make_nvp("temp", *this); 
48  } 
49 
50 }; 
51 
70 struct LaserOffset 
71 { 
72 Offset laser; 
90 laser.serialize(Archive & ar, const unsigned int version); 
91 //laser.save(const std::string& filename); 
98 }; 

168 #endif 

それが現在投げているエラーは次のとおりです。

OffsetConfig.h:90: error: ISO C++ forbids declaration of ‘laser’ with no type 

OffsetConfig.h:90: error: expected ‘;’ before ‘.’ token 

誰もが私が間違っているの何で私を助けることができますか?構造体からserialise/save要素を使用する方法と、個々の構造体のために保存する方法を教えてください。マティアスが言ったように、あなたのコードスニップでは、

typedef struct Offset {}; 

がように記述しなければならない

+0

serializeを呼び出すと、 "struct LaserOffset 'にメンバー' serialize 'がありません。 –

+1

C++で' typedef struct'は必要ありません。単純に 'struct'で十分です。 – mavam

答えて

0

、Cであなたが使用する必要がありますしているときに、Offset _offset;によって構造体オブジェクトを定義することができ、C++で

struct Offset {};  

原因struct Offset _offset;。ですから、一般的にtypedef struct Offset{} Offset;

を使用したい、ISO C++なしタイプyour_varの宣言を禁じgccがyour_varの宣言を見つけることができませんを意味します。それが発生すると、インクルードファイル、your_varの定義と、通常はこのエラーを引き起こす名前空間をチェックする必要があります。

BTW、#pargma onceおよび#ifndef ... #define ...も同じことをします。

関連する問題