提问人:JamalNewtron 提问时间:10/5/2023 最后编辑:EvgJamalNewtron 更新时间:10/5/2023 访问量:32
提升包含 unique_ptr pont 到的其他对象的对象的序列化 [duplicate]
boost serialization on objects containing other objects ponted to by unique_ptr [duplicate]
问:
这个问题在这里已经有答案了:
什么是未定义的引用/未解析的外部符号错误,如何解决? (39 个回答)
为什么模板只能在头文件中实现? (19 个答案)
上个月关闭。
这篇文章在上个月被编辑并提交审查,但未能重新打开该帖子:
重复这个问题已经得到回答,不是唯一的,也没有与另一个问题区分开来。
我有一个 A 类的对象,它是来自不同类 X、Y、Z 的其他几个对象的组合......这些类是通过unique_ptr指向的。假设子类 X、Y、Z 只有基元数据类型。
我正在尝试序列化我的对象,因此我在类 A 中添加了一个保存和加载方法。对于类 A 的原始数据类型成员,这行得通。
// Class A HPP:
private:
int m_classXID{};
std::unique_ptr<Class_X> m_classXObject;
...
template<class Archive>
void save(Archive& ar, const unsigned int version) const;
template<class Archive>
void load(Archive& ar, const unsigned int version);
template<class Archive>
void serialize(Archive& ar, const unsigned int version);
...
实现:
// Class A CPP:
...
template<class Archive>
void Class_A::save(Archive& ar, const unsigned int version) const
{
ar << m_classXID;
}
template<class Archive>
void Class_A::load(Archive& ar, const unsigned int version)
{
ar >> m_classXID;
}
template<class Archive>
void Class_A::serialize(Archive& ar, const unsigned int version)
{
boost::serialization::split_member(ar, *this, 1);
}
...
现在我想更进一步,尝试为其中一个子类实现序列化。
例如,我所做的是将以下代码添加到类 X 中:
// Class X HPP:
private:
// Gives the serialization infrastructure access to the serialize function!
friend class boost::serialization::access;
// Archive
template<class Archive>
void serialize(Archive& ar, const unsigned int version);
实施部分:
// Class X CPP:
template <typename Archive>
void Class_X::serialize(Archive& ar, const unsigned int version)
{
ar& m_firstInt;
ar& m_secondInt;
ar& m_thirdInt;
ar& m_fourthInt;
...;
}
现在我完全不知道如何处理 A 类的 save 和 load 方法的实现部分。
我尝试了很多,甚至不记得是什么。我目前所处的位置如下所示:
template<class Archive>
void Class_A::save(Archive& ar, const unsigned int version) const
{
ar << m_classXID;
ar << m_classXObject;
}
template<class Archive>
void Class_A::load(Archive& ar, const unsigned int version)
{
ar >> m_classXID;
m_classXObject = std::make_unique<Class_X>();
ar >> m_classXObject;
}
template<class Archive>
void Class_A::serialize(Archive& ar, const unsigned int version)
{
boost::serialization::split_member(ar, *this, 1);
}
但是我从 Microsoft Visual Studio 收到一条关于“未解析的外部符号...LINK2019。我想对我的方法进行审查。LINK错误不是我主要关心的问题。
更新:非常感谢模板的提示!->仅在标题中。这需要我几天的时间才能解决!非常感谢!!将所有内容移动到头文件中解决了这个问题。
答: 暂无答案
评论