Серийный вариант повышения; очень странная и туповатая ошибка компилятора (MSVC 2010)

Я пытаюсь сериализовать класс, содержащий вариант повышения для хранения во встроенной базе данных MYSQL. Раньше я использовал объединение, но я преобразовал его в вариант, потому что ускоритель serializer имеет встроенную поддержку для сериализации типа варианта.

Проблема заключается в этой ошибке компилятора:

4>default : error : 'which' out of range.");
4> ^
4> detected during:
4> instantiation of "Visitor::result_type boost::detail::variant::visitation_impl(int, int, Visitor &, VoidPtrCV, boost::mpl::false_, NoBackupFlag, Which *, step0 *) [with Which=boost::mpl::int_<0>, step0=boost::detail::variant::visitation_impl_step<boost::mpl::l_iter<boost::mpl::l_item<boost::mpl::long_<3l>, u32={unsigned int}, boost::mpl::l_item<boost::mpl::long_<2l>, i32={int}, boost::mpl::l_item<boost::mpl::long_<1l>, f32={float}, boost::mpl::l_end>>>>,
4> boost::mpl::l_iter<boost::mpl::l_end>>, Visitor=boost::detail::variant::destroyer, VoidPtrCV=void *, NoBackupFlag=boost::variant<u32={unsigned 4="" int},="" i32="{int}," f32="{float}," boost::detail::variant::void_,=""> boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_>::has_fallback_type_]" at line 1802 of "..\..\extern\boost/variant/variant.hpp"
4> instantiation of "Visitor::result_type boost::variant<t0_, t1,="" t2,="" t3,="" t4,="" t5,="" t6,="" t7,="" t8,="" t9,="" t10,="" t11,="" t12,="" t13,="" t14,="" t15,="" t16,="" t17,="" t18,="" t19="">::internal_apply_visitor_impl(int, int, Visitor &, VoidPtrCV) [with T0_=u32={unsigned int}, T1=i32={int}, T2=f32={float}, T3=boost::detail::variant::void_, T4=boost::detail::variant::void_, T5=boost::detail::variant::void_, T6=boost::detail::variant::void_, T7=boost::detail::variant::void_, T8=boost::detail::variant::void_,
8> ^
8> 
</t0_,></u32={unsigned></boost::mpl::l_end></boost::mpl::long_<1l></boost::mpl::long_<2l></boost::mpl::l_iter<boost::mpl::l_item<boost::mpl::long_<3l>

Вот соответствующий код для сериализации варианта:       ...

template<class archive="">
 void serialize(Archive & ar, const unsigned int version)
 {
 ar & m_apszValueNames;
 ar & m_apszEnumOptions;
 ar & m_asValues;
 ar & m_aValues;
 ar & m_Flags;
 ar & m_Type;
 ar & m_pszName;
 ar & sm_kpszValue1Name;
 ar & sm_kpszValue2Name;
 ar & sm_kpszValue3Name;
 ar & sm_kpszValue4Name;
 }
protected:
 static pcstr sm_kpszValue1Name;
 static pcstr sm_kpszValue2Name;
 static pcstr sm_kpszValue3Name;
 static pcstr sm_kpszValue4Name;
 pcstr m_pszName;
 u32 m_Type;
 u32 m_Flags;
 typedef boost::variant<u32, i32,="" f32=""> Value;
 Value m_aValues[ Values::Count ];
 std::string m_asValues[ Values::Count ];
 const pcstr* m_apszEnumOptions;
 pcstr m_apszValueNames[ Values::Count ];
};
</u32,></class>

Ваша помощь очень ценится.

1 ответ

Ваш посетитель имеет тип результата void, и он фактически ничего не делает. Когда вы делаете

ar & boost::apply_visitor( variant_visitor(), m_aValues );

вы пытаетесь сериализовать значение void. Если variant имеет поддержку сериализации вне коробки, этого должно быть достаточно, чтобы сделать

ar & m_aValues;

licensed under cc by-sa 3.0 with attribution.