序列化指向没有默认构造函数的类的指针时无法覆盖 save_construct_data

Posted

技术标签:

【中文标题】序列化指向没有默认构造函数的类的指针时无法覆盖 save_construct_data【英文标题】:Trouble overriding save_construct_data when serializing a pointer to a class without a default constructor 【发布时间】:2010-11-06 05:28:15 【问题描述】:

我正在尝试遵循此示例 http://www.boost.org/doc/libs/1_42_0/libs/serialization/doc/serialization.html#constructors,但我不断收到错误消息。按照示例,我在尝试访问私有变量时遇到错误(很公平):

bs.cpp:10: error: ‘const int my_class::m_attribute’ is private

但是,如果我将 save_construct_data 添加为朋友,我会收到一个模棱两可的错误:

/usr/include/boost/serialization/serialization.hpp:148: error: call of overloaded ‘save_construct_data(boost::archive::text_oarchive&, const my_class*&, const boost::serialization::version_type&)’ is ambiguous
/usr/include/boost/serialization/serialization.hpp:83: note: candidates are: void boost::serialization::save_construct_data(Archive&, const T*, unsigned int) [with Archive = boost::archive::text_oarchive, T = my_class]
bs.cpp:10: note:                 void boost::serialization::save_construct_data(Archive&, const my_class*, unsigned int) [with Archive = boost::archive::text_oarchive]
bs.cpp:29: note:                 void boost::serialization::save_construct_data(Archive&, const my_class*, unsigned int) [with Archive = boost::archive::text_oarchive]

我可以将函数定义移动到朋友声明中,但这很丑。

接下来我应该尝试什么?

谢谢, 杰恩

【问题讨论】:

您能否展示您尝试将save_construct_data 声明为好友的代码? pastebin.com/embed_iframe.php?i=d9zBvJag - 特别是 "template 朋友 void boost::serialization::save_construct_data(Archive & ar, const my_class * t, const unsigned int file_version);" 【参考方案1】:

save_construct_data 必须先声明,然后才能成为好友。关于在不同的命名空间中的一些事情。像这样:

namespace boost  namespace serialization 
template<class Archive>
inline void save_construct_data(Archive & ar, const my_class * t, const unsigned int file_version);

但是,因为这取决于 my_class,所以您还必须声明 my_class:

class my_class;

所以整个事情看起来像http://pastebin.com/embed_iframe.php?i=aFyCpjyY

【讨论】:

【参考方案2】:

确保 save_construct_data 方法没有在除了 boost 库调用方法(boost::serialization)之外的不同范围内声明

在自定义命名空间中声明 save_construct_data 会导致歧义问题,因为 boost 不知道要调用哪个方法

【讨论】:

save_construct_data 在 boost 库调用方法的范围内声明 (boost::serialization) 正确,这就是我的意思可能导致问题。假设你有命名空间 blah class blah2 ... void save_construct_data(...)... 你将把 save_construct_data 方法放在命名空间 blah 中,你会有一个歧义错误 我刚刚说我有命名空间 boost namespace serialization ... void save_construct_data(...)... 并且我已将 save_construct_data 方法放在命名空间 boost::serialization 中。

以上是关于序列化指向没有默认构造函数的类的指针时无法覆盖 save_construct_data的主要内容,如果未能解决你的问题,请参考以下文章

包含指向派生模板类的基类指针的类的赋值运算符和复制构造函数

如何获得指向类的复制构造函数的成员函数指针?

是否可以定义指向构造函数的函数指针?

父类的复制构造函数中的嵌套类缺少默认构造函数

杰克逊错误:没有适合简单类的构造函数

实验五——类的多态,继承和派生2