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

时间:2010-11-06 05:28:15

标签: c++ pointers boost boost-serialization default-constructor

我正在尝试关注此示例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]

我可以将函数定义移动到friend声明中,但那只是丑陋。

我接下来应该尝试什么?

谢谢, Jayen

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:-1)

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

在自定义命名空间中声明save_construct_data会导致歧义问题,因为提升无法知道调用哪种方法