【问题标题】:Boost serialization of base class of final subclass error提升最终子类错误的基类序列化
【发布时间】:2013-09-24 12:48:21
【问题描述】:

我正在尝试使用boost::serialization 序列化一个类,但是当派生类声明为final 时它会失败。

#include <fstream>

#include <boost/serialization/access.hpp>
#include <boost/serialization/base_object.hpp>
#include <boost/archive/binary_oarchive.hpp>

class Base {
public:
    virtual ~Base() = default;
    virtual void Foo() = 0;

private:
    friend class boost::serialization::access;
    template <typename Archive>
    void serialize(Archive& archive, const unsigned int version) {}
};

class Derived final: public Base {
public:
    void Foo() override {}

private:
    friend class boost::serialization::access;
    template <typename Archive>
    void serialize(Archive& archive, const unsigned int version) {
        archive & boost::serialization::base_object<Base>(*this);
    }
};

int main() {
    Derived foo;

    std::ofstream output("output");
    boost::archive::binary_oarchive archive(output);
    archive << foo;
}

error: cannot derive from ‘final’ base ‘Derived’ in derived type ‘boost::detail::is_virtual_base_of_impl<Base, Derived, mpl_::bool_<true> >::boost_type_traits_internal_struct_X’ struct boost_type_traits_internal_struct_X : public Derived, virtual Base

如果省略 final 说明符,则没有错误。此错误的原因是什么以及如何避免?

【问题讨论】:

    标签: c++ boost c++11 boost-serialization


    【解决方案1】:

    原因是is_virtual_base_of,Boost 的一个实现细节,试图从它的参数派生来确定(通过比较大小)一个类是否是另一个类的虚拟基。

    在编写它的时候,没有final 类,因此没有考虑这种情况。您可能想在 Boost 邮件列表中询问是否有人可以增强/修复它,这可能会也可能不会。 Boost 传统上会尽力检测类型特征,但可以做的事情是有限度的。大多数编译器都有确定某些类型属性的内置方法,因为仅使用 C++ 代码无法检测到它们。

    【讨论】:

      猜你喜欢
      • 2018-12-13
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      • 2019-05-15
      • 1970-01-01
      • 1970-01-01
      • 2015-09-23
      • 2015-07-22
      相关资源
      最近更新 更多