C++ 如何使boost::serialization与std::shared_ptr一起工作?
这个问题已经在很多地方讨论过了,但答案似乎并没有真正针对最新的Boost库 为了说明这个问题,假设我们想要序列化一个包含共享指针(C++ 如何使boost::serialization与std::shared_ptr一起工作?,c++,boost,boost-serialization,C++,Boost,Boost Serialization,这个问题已经在很多地方讨论过了,但答案似乎并没有真正针对最新的Boost库 为了说明这个问题,假设我们想要序列化一个包含共享指针(std::shared_ptr)的类,以及一个静态的load函数,该函数将从文件构建类,另一个save函数将实例存储到文件中: #include <boost/archive/text_iarchive.hpp> #include <boost/archive/text_oarchive.hpp> #include <boost/seri
std::shared_ptr
)的类,以及一个静态的load
函数,该函数将从文件构建类,另一个save
函数将实例存储到文件中:
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/serialization/shared_ptr.hpp>
#include <fstream>
#include <memory>
#include <vector>
class A
{
public:
std::shared_ptr<int> v;
void A::Save(char * const filename);
static A * const Load(char * const filename);
//////////////////////////////////
// Boost Serialization:
//
private:
friend class boost::serialization::access;
template<class Archive> void serialize(Archive & ar, const unsigned int file_version)
{
ar & v;
}
};
// save the world to a file:
void A::Save(char * const filename)
{
// create and open a character archive for output
std::ofstream ofs(filename);
// save data to archive
{
boost::archive::text_oarchive oa(ofs);
// write the pointer to file
oa << this;
}
}
// load world from file
A * const A::Load(char * const filename)
{
A * a;
// create and open an archive for input
std::ifstream ifs(filename);
boost::archive::text_iarchive ia(ifs);
// read class pointer from archive
ia >> a;
return a;
}
int main()
{
}
#包括
#包括
#包括
#包括
#包括
#包括
甲级
{
公众:
std::共享的ptr v;
void A::Save(char*const文件名);
静态*const加载(char*const文件名);
//////////////////////////////////
//增强序列化:
//
私人:
好友类boost::serialization::access;
模板无效序列化(存档&ar,常量未签名整数文件\u版本)
{
ar&v;
}
};
//将世界保存到文件:
void A::Save(char*const文件名)
{
//创建并打开用于输出的角色存档
std::ofs流(文件名);
//将数据保存到存档
{
boost::archive::text\u oarchive oa(ofs);
//将指针写入文件
oa>a;
返回a;
}
int main()
{
}
上面的代码生成一长串错误,从c:\local\boost\u 1\u 54\u 0\boost\serialization\access.hpp(118)开始:error C2039:“serialize”:不是“std::shared_ptr”的成员
,据我所知,这不应该是真的,因为我已经加载了boostshared_ptr
序列化库,该库表面上支持std::shared_ptr
。我缺少什么
注:据我所知,我认为
boost/serialization/shared_ptr.hpp
为std::shared_ptr
定义了一个serialize
函数的假设是错误的,因此这个问题的正确答案可能是我必须为std::shared_ptr定义自己的serialize
函数e> 或者转换为boost::shared\u ptr
否,std::shared\u ptr和boost::shared\u ptr是不相关的类模板
Boost.Serizalization
不支持开箱即用的std::shared_ptr
,但您可以在应用程序中添加这样的支持-只需查看
标题。这是我自己能想到的最好答案。如果有人对此有更好的说法,我会接受作为answe而不是r。
boost附带的boost/serialization/shared_ptr.hpp
头不支持std::shared_ptr
,但支持boost::shared_ptr
。如果您想在不盗用自己的序列化代码的情况下使用共享指针对象实现序列化,则需要转换std::shared_ptr
>对象到boost::shared_ptr
对象和
我的误解是我认为
boost/serialization/shared\u ptr.hpp
为std::shared\u ptr
定义了一个serialization
方法。我错了。我知道这一点;这是我问题的基础。@ausairman那么你的问题就不清楚了。你说“boost 1.54应该支持std::shared\u ptr”-这是不正确的。好吧。我现在已经明确表示我正在尝试使用boost/serialization/shared_ptr.hpp
头。另外,我的理解是它确实支持std::shared_ptr
;否则为什么它会附带定义序列化方法的头?对不起,我想我误解了libr的用法ary和你的答案。你是说boost/serialization/shared_ptr.hpp
头不是std::shared_ptr
的序列化?从std::shared_ptr
到boost::shared_ptr
的转换,我已经看到存储是一个析构函数,一个通过值捕获的可变lambdaant要序列化这种结构,您仍然需要一种序列化析构函数的方法,因此出现了std::shared_ptr
。这就是鸡和蛋的问题。您是否知道其他转换会有不同的做法?