这个问题一直是asked here和其他一些地方,但答案似乎并没有真正解决最新的Boost库。
为了说明这个问题,假设我们要序列化一个包含共享指针(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()
{
}
上面的代码从c:\local\boost_1_54_0\boost\serialization\access.hpp(118): error C2039: 'serialize' : is not a member of 'std::shared_ptr<_Ty>'
开始生成一个很长的错误列表,据我所知,由于我加载了表面上支持std::shared_ptr
的boost shared_ptr
序列化库,这不应该是正确的。我在这里错过了什么?
注意:据我所知,我认为boost/serialization/shared_ptr.hpp
为 std::shared_ptr
定义了 serialize
函数的假设是错误的,因此,对这个问题的正确答案可能是,我必须为E 229
std::shared_ptr
E 133
定义自己的 serialize
函数,或者转换为E 234
boost::shared_ptr
。
发布于 2013-09-28 08:56:30
不,std::shared_ptr和boost::shared_ptr是不相关的类模板。
Boost.Serizalization
不支持开箱即用的std::shared_ptr
,但是您可以在应用程序中添加这样的支持--只需查看<boost/serialization/shared_ptr.hpp>
头。
发布于 2013-09-29 00:46:31
,这是我自己想出的最好的答案。如果有人对此有更好的看法,我会接受这个答案。。
增强工具的boost/serialization/shared_ptr.hpp
头不是支持std::shared_ptr
,而是支持boost::shared_ptr
。如果您想使序列化与共享指针对象一起工作,而不盗用您自己的序列化代码,则需要将您的std::shared_ptr
对象转换为boost::shared_ptr
对象和live with the consequences。
我的误解是,我认为boost/serialization/shared_ptr.hpp
为std::shared_ptr
定义了一个serialize
方法。我错了。
https://stackoverflow.com/questions/19064221
复制相似问题