我有一个来自3rdparty开源数学库的mat4课程。它没有自己的序列化方法,所以我在我的主项目中创建了一个包含矩阵mat4序列化的单独标题:
namespace boost {
namespace serialization {
template<class Archive>
void serialize(Archive & ar, mat4 & matrix, const unsigned int version)
{
// some serialization of matrix goes here...
}
} // namespace serialization
} // namespace boost
直到稍后我将序列化直接添加到类mat4并忘记删除旧的序列化时,它才能完美运行:
struct mat4
{
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & BOOST_SERIALIZATION_NVP(data);
}
// some other members and functions goes here
};
经过这样的修改后,调用了自由函数序列化。 你能解释为什么调用自由函数而不是mat4成员函数吗?也许,我错过了标准中的一些简单规则。
当我注释掉自由函数时 - 调用成员函数。
答案 0 :(得分:1)
原因在于boost::serialization
使用的技术允许自由功能和成员职能。基本上有一个带有以下签名的自由函数:
template< typename Archive, typename Type >
void serialize( Archive& a_Arch, Type& a_Inst, const unsigned int a_Version )
{
a_Inst.serialize( a_Arch, a_Version );
}
当C ++认为函数匹配时,最专业的一个胜出,这意味着Type
不那么通用的任何自由函数,例如用户定义的自由序列化函数总是胜利。如果没有,则上述函数胜出,这仅适用于Type
,其序列化成员接受存档&amp;版本