使用带有xml_oarchive的Boost序列化时assertion_failed

时间:2014-02-02 07:46:20

标签: c++ boost boost-serialization

编译Boost序列化的简单测试时:

class Test
{
protected:
    int Num;

    friend class boost::serialization::access;
    template <class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & BOOST_SERIALIZATION_NVP(Num);
    }

public:
    Test(): Num(0) {}
    ~Test() {}
};

使用xml_oarchive输出,我遇到以下GCC错误:

C:\Development\Libraries\boost_1_55_0\boost\mpl\assert.hpp|289|error: no matching function for call to 'assertion_failed(mpl_::failed************ boost::serialization::is_wrapper<Test>::************)'|

使用其他oarchive类型时,它编译并运行正常。我所做的所有研究都指出我使用BOOST_SERIALIZATION_NVP宏来解决错误,但我已经这样做了,我仍然得到这个错误。

有没有人遇到同样的问题?

3 个答案:

答案 0 :(得分:6)

如boost序列化的源代码中所述:

// Anything not an attribute and not a name-value pair is an
// error and should be trapped here.
template<class T>
void save_override(T & t, BOOST_PFTO int)
{
    // If your program fails to compile here, its most likely due to
    // not specifying an nvp wrapper around the variable to
    // be serialized.
    BOOST_MPL_ASSERT((serialization::is_wrapper< T >));
    this->detail_common_oarchive::save_override(t, 0);
}

您可能不会将它与Test对象一起使用:

Test test;
ar << BOOST_SERIALIZATION_NVP(test);

答案 1 :(得分:0)

当我忘记在新项目中包含我们的源代码时,我得到了boost :: assertion_failed未定义的错误。

独立于其他任何事情,你应该定义boost :: assertion_failed,如http://www.boost.org/doc/libs/1_55_0/libs/utility/assert.html所述(版本匹配OP&#39;的日期问题,但最近类似)和https://stackoverflow.com/a/21508521/527489的答案

正如文档中所述,&#34;用户应提供适当的定义。&#34;

定义这个可能会使编译器错误不那么令人沮丧(尽管可能仍然非常令人沮丧)。

答案 2 :(得分:0)

我想补充一点,Boost.Serialization的文档实际上明确地说明了这一点,因为似乎没人提到它。

您的代码仅在使用xml_oarchive而非其他oarchive类型时才能编译。这是boost的官方解释
来自http://www.boost.org/doc/libs/1_45_0/libs/serialization/doc/wrappers.html#nvp
(强调我的)

  

XML档案提供了一些特殊情况。 XML格式有嵌套   很好地映射到“递归类成员访问者”的结构   序列化系统使用的模式。但是,XML不同于   其他格式它需要每个类数据成员的名称。   我们的目标是将此信息添加到类序列化中   规范,同时仍然允许序列化代码   与任何档案一起使用。