Проблема с переопределением save_construct_data при сериализации указателя на класс без конструктора по умолчанию

Я пытаюсь следовать этому примеру 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]

Я могу переместить определение функции в объявление друга, но это просто некрасиво.

Что мне попробовать дальше?

Спасибо, Джейен


person Jayen    schedule 06.11.2010    source источник
comment
Можете ли вы показать код вашей попытки объявить save_construct_data другом?   -  person Bart van Ingen Schenau    schedule 08.11.2010
comment
pastebin.com/embed_iframe.php?i=d9zBvJag – в частности шаблон‹архив класса› друг void boost::serialization::save_construct_data(Архив и ar, const my_class * t, const unsigned int file_version);   -  person Jayen    schedule 09.11.2010


Ответы (2)


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

person Jayen    schedule 10.05.2011

Убедитесь, что метод save_construct_data не объявлен в другой области, кроме той, из которой библиотека boost вызывает методы (boost::serialization).

Объявление save_construct_data в пользовательском пространстве имен вызовет проблемы с двусмысленностью, поскольку boost не будет знать, какой метод вызывать.

person well_then    schedule 09.05.2011
comment
save_construct_data объявляется в области, из которой библиотека boost вызывает методы (boost::serialization) - person Jayen; 10.05.2011
comment
Правильно, это то, что я имел в виду, может вызвать проблему. Скажем, у вас есть пространство имен blah{ class blah2{ ... void save_construct_data(...){...} } }, вы поместите метод save_construct_data внутри пространства имен blah, и у вас будет ошибка неоднозначности - person well_then; 10.05.2011
comment
Я только что сказал, что у меня есть пространство имен boost{ сериализация пространства имен{ ... void save_construct_data(...){...} } }, и я поместил метод save_construct_data внутри пространства имен boost::serialization. - person Jayen; 12.05.2011