Visual Studio 2012错误C2039:'serialize':不是'std :: shared_ptr< _Ty>'的成员

时间:2012-10-11 08:54:39

标签: c++ boost visual-studio-2012 shared-ptr

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

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

我一直在寻找,但迄今为止没有任何帮助过我。

示例代码:

foo.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
);

2 个答案:

答案 0 :(得分:1)

boost::serialization是可扩展的,可以扩展为适用于任何类型,因此您可以为load/save实现自己的std::shared_ptr版本,请查看boost_installation_path/boost/serialization/shared_ptr.hpp和从中实现自己的load/save。作为另一种解决方法,您可以使用boost::shared_ptr代替std::shared_ptr !!由于您使用的是boost,因此我认为使用std::shared_ptr优于boost::shared_ptr

没有优势

答案 1 :(得分:1)

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

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