0

我在编译我的静态类库时遇到了这个问题。

我知道 Boost 并没有正式支持 VS2012,但由于这是我目前的开发环境,我真的可以使用一些建议。

我一直在四处寻找,但到目前为止没有任何帮助。

示例代码:

富.h:

#include "FooImpl.h"
#include <boost/serialization/serialization.hpp>
#include <boost/serialization/shared_ptr.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>

class Foo
{
public:
    Foo(void) : pImpl(std::make_shared<FooImpl>()) {}
    //similar constructors follow

    //a few get methods here
private:
    std::shared_ptr<FooImpl> pImpl;

    friend class boost::serialization::access;
    template <typename Archive>
    void serialize(Archive & ar, const unsigned int file_version);
}

Foo.cpp:

#include "stdafx.h"
#include "Foo.h"

template<class Archive>
void Foo::serialize(Archive& ar, const unsigned int ver) 
{  
    ar & pImpl;
}

template void Foo::serialize<boost::archive::text_iarchive>(
    boost::archive::text_iarchive & ar, 
    const unsigned int file_version
);
template void Foo::serialize<boost::archive::text_oarchive>(
    boost::archive::text_oarchive & ar, 
    const unsigned int file_version
);

FooImpl.h:

#include <boost/serialization/serialization.hpp>
#include <boost/serialization/string.hpp>

class FooImpl
{
public:
    FooImpl(void);
    //other constructors, get methods

private:
    //data members - unsigned int & std::wstring

    friend class boost::serialization::access;
    template <typename Archive>
    void serialize(Archive& ar, const unsigned int ver);
};

FooImpl.cpp:

#include "stdafx.h"
#include "FooImpl.h"

//function implementations

template <typename Archive>
void FooImpl::serialize(Archive& ar, const unsigned int ver)
{
    ar & id_;
    ar & code_;
}

//Later added, serialization requires these

template void FooImpl::serialize<boost::archive::text_iarchive>(
    boost::archive::text_iarchive & ar, 
    const unsigned int file_version
);

template void FooImpl::serialize<boost::archive::text_oarchive>(
    boost::archive::text_oarchive & ar, 
    const unsigned int file_version
);
4

2 回答 2

1

boost::serialization是可扩展的,可以扩展为使用任何类型,因此您可以实现自己的load/savefor版本,std::shared_ptr查看boost_installation_path/boost/serialization/shared_ptr.hpp并从中实现自己的版本load/saveboost::shared_ptr作为另一种解决方法,您可以使用std::shared_ptr!! 既然你正在使用,boost我认为使用std::shared_ptrover没有任何优势boost::shared_ptr

于 2012-10-11T09:09:57.830 回答
1

您正在尝试序列化指针。你想序列化指针指向的东西。最简单的方法是替换foo << ptr;foo << (*ptr);.

周围的括号*ptr不是必需的,许多人会将它们视为笨拙的标志。但是,如果您发现它们使您更清楚,请使用它们。

于 2012-10-11T11:45:32.457 回答