2012-04-12 76 views
0

我是編程和C++的新手,似乎遇到了這個問題。使用boost :: serialize在struct中聲明到另一個struct

我正在用各種傳感器偏移量創建配置文件,並將其存儲爲xml,可以使用boost :: serialization load將其存儲爲其他類。因爲所有的傳感器都有相同類型的偏移量,我想用偏移量定義來創建一個通用結構。我想保持序列化和保存/加載到通用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元素,以及如何將其保存爲單個結構?

+0

忘記添加,調用serialize也會導致錯誤「struct LaserOffset'沒有成員'serialize' – 2012-04-12 04:40:45

+1

您不需要在C++中使用'typedef struct',只需'struct'就足夠了。 – mavam 2012-04-12 04:51:16

回答

0

正如馬蒂亞斯說,在你的代碼剪斷,

typedef struct Offset {}; 

應該這樣寫,

struct Offset {};  

原因在C++中,你可以通過Offset _offset;定義一個struct對象,而在C你應該使用struct Offset _offset;。所以,你想用typedef struct Offset{} Offset;

一般來說,ISO C++禁止的your_var聲明無類型意味着GCC找不到your_var聲明。發生這種情況時,應檢查包含文件,your_var的定義以及通常會導致此錯誤的名稱空間。

順便說一句,#pargma once#ifndef ... #define ...做同樣的事情。