Visual Studio 2012 error C2039: 'serialize' : is not a member of 'std::shared_ptr<_Ty>'

那年仲夏 提交于 2019-12-12 04:48:48

问题


I am stuck with this problem while compiling my static class library.

I know that Boost doesn't officially support VS2012 but since this is my current development environment, I could really use some advice.

I have been searching around but nothing so far has helped me.

Sample code:

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

回答1:


You are trying to serialize pointers. You want to serialize the thing the pointer points to. The simplest way is to replace foo << ptr; with foo << (*ptr);.

The parentheses around *ptr are not necessary and many would see them as a sign of clumsiness. But if you find they make things clearer for you, use them.




回答2:


boost::serialization is an extensible that can extended to work with any types, so you can implement your own version of load/save for std::shared_ptr, take a look at boost_installation_path/boost/serialization/shared_ptr.hpp and implement your own load/save from it. As another workaround you can use boost::shared_ptr in place of std::shared_ptr!! since you are using boost I see no advantage of using std::shared_ptr over boost::shared_ptr



来源:https://stackoverflow.com/questions/12835780/visual-studio-2012-error-c2039-serialize-is-not-a-member-of-stdshared-pt

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!