我是编程和C ++的新手,似乎遇到了这个问题。
我正在创建一个包含各种传感器偏移的配置文件,并将其存储为xml,可以使用boost :: serialization load从其他类读取。
由于所有传感器具有相同类型的偏移量,我想制作具有偏移定义的通用结构。我想保留序列化并保存/加载在通用stuct中,并且只在需要时才在不同的struct中实例化。
每个传感器都有自己的结构,因此其他类只需要使用它们需要的传感器结构。
最初,我在每个传感器结构中都有序列化/保存/加载,并且它工作正常。但是在将其转换为通用结构后,我似乎无法调用它。
代码是:
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
任何人都可以帮我解决我做错的事吗?以及如何使用结构中的序列化/保存元素,以及如何为单个结构保存它?
答案 0 :(得分:0)
正如Matthias所说,在你的代码片段中,
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
的定义和命名空间,这通常会导致此错误。
BTW,#pargma once
和#ifndef ... #define ...
做同样的事情。