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>
更新到 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>