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

我知道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
);

最佳答案

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

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

关于c++ - Visual Studio 2012错误C2039:'serialize':不是'std::shared_ptr <_Ty>'的成员,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12835780/

10-15 01:08
查看更多