После обновления до Boost 1.74 я получаю слишком много предупреждающих сообщений вместе с ошибкой компиляции.
/usr/include/boost/date_time/posix_time/time_serialize.hpp:48:1: ошибка: «split_free» не был объявлен в этой области, и при поиске, зависящем от аргумента, в момент создания экземпляра не было найдено объявлений [-fpermissive]
...
/usr/include/boost/serialization/split_free.hpp:64:13: примечание: 'template<class Archive, class T> void boost::serialization::split_free(Archive&, T&, unsigned int)' объявлено здесь, позже в единица перевода
происхождение этой ошибки
ar & BOOST_SERIALIZATION_NVP(_created);
_created
относится к типу boost::posix_time::ptime
Это ошибка? или что-то новое введено в 1.74, что вызвало это? Как это исправить?
Это незначительный недостаток библиотеки Boost Datetime. Заголовок сериализации не включает все необходимые заголовки.
Это воспроизводится для Boost 1.74.0 на GCC 10:
#include <boost/date_time.hpp>
using boost::posix_time::ptime;
#include <boost/date_time/posix_time/time_serialize.hpp>
#include <boost/archive/xml_oarchive.hpp>
int main() {
boost::archive::xml_oarchive oa(std::cout);
ptime _created = boost::posix_time::second_clock::local_time();
oa & BOOST_SERIALIZATION_NVP(_created);
}
Порядок замены включает в себя:
#include <boost/archive/xml_oarchive.hpp>
#include <boost/date_time/posix_time/time_serialize.hpp>
Достаточно исправить это: Live ON Coliru
Отпечатки
<?xml version = "1.0" encoding = "UTF-8" standalone = "yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature = "serialization::archive" version = "17">
<_created class_id = "0" tracking_level = "0" version = "0">
<ptime_date class_id = "1" tracking_level = "0" version = "0">
<date>20201212</date>
</ptime_date>
<ptime_time_duration class_id = "2" tracking_level = "0" version = "1">
<is_special>0</is_special>
<time_duration_hours>23</time_duration_hours>
<time_duration_minutes>26</time_duration_minutes>
<time_duration_seconds>38</time_duration_seconds>
<time_duration_fractional_seconds>0</time_duration_fractional_seconds>
</ptime_time_duration>
</_created>
</boost_serialization>