繁体   English   中英

void* 指针类型的 boost 序列化无法编译

[英]boost serialization for void* pointer type does not compile

我需要序列化一个简单的结构,它有一个 void * 类型的指针,但是当我序列化时它给出错误“C2338: boost::serialization::tracking_level< T >::value != boost::serialization::track_never”指向shared_ptr.hpp 在第 167 行 下面是代码

#include <boost/serialization/access.hpp>
#include <boost/serialization/base_object.hpp> 
#include <boost/serialization/optional.hpp> 
#include <boost/serialization/map.hpp> 
#include <boost/serialization/shared_ptr.hpp>

  struct Man
   {

       Man();
       virtual ~Man();


      std::list<boost::shared_ptr<void *>> condition; 

   private:
      friend class boost::serialization::access;
      template<class Archive>
      void serialize(Archive &ar, const unsigned int version)
      {
         ar & condition;  // if i comment this line.. issue goes away.. 
      } 
   };

   struct SuperMan
   {
   public:
      SuperMan(void);
      SuperMan(const parameter_strings & parms);

      virtual ~SuperMan(void);


      boost::optional<anyURI> detail;
      boost::optional<SuperManInfo> SuperMan_info;            

   private:
      friend class boost::serialization::access;
      template<class Archive>
      void serialize(Archive &ar, const unsigned int version)
      {
         ar & SuperMan_info;
         ar & detail;
      } 

   };

确实 boost 支持 void* 指针的序列化,如果是的话.. 成员变量是否以错误的方式序列化?

No Boost Serialization 不支持void*的序列化。 原因很简单,没有类型信息,所以它不可能知道应该序列化什么。

对指针恰好具有的值进行序列化是完全没有用的,因为在大多数平台上,这只是正在运行的进程上下文中的临时地址,当您读回它时,该值将毫无意义。

出于这个原因, shared_ptr<void*>也是一个无用的想法。 (除非void*实际上是某种不透明的 HANDLE,并且您使用自定义删除器来释放与该句柄对应的资源: 零规则文章)。

所以,找出你的condition集合中的真正内容。 修复类型以反映这一点,或手动修复序列化代码以强制转换,否则强制将相关数据包含在存档中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM