【发布时间】:2018-06-05 12:35:45
【问题描述】:
我想序列化具有彼此的 std::shared_ptr 作为成员并且在不同文件中声明和定义的类。我的代码的一个最小示例是:
//auxiliary.h
#include <memory>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/shared_ptr.hpp>
class A;
class B;
typedef std::shared_ptr< A > A_ptr;
typedef std::shared_ptr< B > B_ptr;
//A.h
#include "auxiliary.h"
class A{
B_ptr bpt;
void foo();
//...
};
//A.cpp
#include "A.h"
void A::foo()
{
//implementation
}
//B.h
#include "auxiliary.h"
class B{
A_ptr apt;
void bar();
//...
};
//B.cpp
#include "B.h"
void B::bar()
{
//implementation
}
当我现在尝试通过编写来序列化这两个类时
//A.h
#include "auxiliary.h"
class A{
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & B_ptr;
}
B_ptr bpt;
void foo();
//...
};
和
//B.h
#include "auxiliary.h"
class B{
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & A_ptr;
}
A_ptr apt;
void bar();
//...
};
我收到错误 C2139 "A": undefined class is not allowed as a argument to compiler intrinsic type __is_base_of
我知道编译器宁愿看到在相应的 cpp 文件中定义的序列化函数,但是因为它们是模板,所以不能以通常的方式工作。
我怎么可能修复整个事情?
PS.:我还读到,它有助于在类似的情况下用手册中使用的所有变体和提升状态来实例化模板,这应该通过
某处完成template void serialize<boost::archive::text_iarchive>(
boost::archive::text_iarchive & ar,
const unsigned int file_version
);
template void serialize<boost::archive::text_oarchive>(
boost::archive::text_oarchive & ar,
const unsigned int file_version
我尝试了各种方法,但都没有成功。
【问题讨论】:
标签: templates serialization boost forward-declaration