Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使boost::serialization与std::shared_ptr一起工作?_C++_Boost_Boost Serialization - Fatal编程技术网

C++ 如何使boost::serialization与std::shared_ptr一起工作?

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

这个问题已经在很多地方讨论过了,但答案似乎并没有真正针对最新的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()
{

}
#包括
#包括
#包括
#包括
#包括
#包括
甲级
{
公众:
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”的成员
,据我所知,这不应该是真的,因为我已经加载了boost
shared_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
。这就是鸡和蛋的问题。您是否知道其他转换会有不同的做法?