2013-09-24 53 views
2

我試圖用boost::serialization序列化一個類,但是當派生類被聲明爲final時它失敗。最終子類基類的Boost序列化錯誤

#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 specificator被省略沒有錯誤。這個錯誤的原因是什麼?它可以避免的原因是什麼?

回答

2

原因是is_virtual_base_of是Boost的一個實現細節,它試圖從它的參數派生出來(通過比較大小)來確定一個類是否是另一個類的虛擬基礎。

在寫入時,沒有final類,因此未考慮此情況。您可能需要在Boost郵件列表上詢問是否有人可以加強/修復它,這可能會也可能不會。 Boost傳統上盡力檢測類型特徵,但是可以做什麼是有限的。大多數編譯器都有內置的方法來確定某些類型的屬性,因爲沒有辦法只用C++代碼來檢測它們。