Boost 1.74 serializing boost::posix_time::ptime getting error: ‘split_free’ was not declared in this scope

Boost 1.74 serializing boost::posix_time::ptime getting error: ‘split_free’ was not declared in this scope

更新到 Boost 1.74 后,我收到太多警告消息和编译错误。

/usr/include/boost/date_time/posix_time/time_serialize.hpp:48:1: error: ‘split_free’ was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]

...

/usr/include/boost/serialization/split_free.hpp:64:13: note: ‘template<class Archive, class T> void boost::serialization::split_free(Archive&, T&, unsigned int)’ declared here, later in the translation unit

此错误的来源是

ar & BOOST_SERIALIZATION_NVP(_created);

_created 的类型是 boost::posix_time::ptime

这是一个错误吗?还是 1.74 中引入了一些新的东西导致了它?如何解决?

这是 Boost Datetime 库中的一个小缺陷。序列化 header 不包括所有必需的 headers.

这为 GCC 10 上的 Boost 1.74.0 重现:

#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>