gpt4 book ai didi

c++ - 序列化 boost 变体;非常奇怪和迟钝的编译器错误(MSVC 2010)

转载 作者:太空狗 更新时间:2023-10-29 23:19:35 24 4
gpt4 key购买 nike

我正在尝试序列化一个包含用于存储在嵌入式 MYSQL 数据库中的 boost 变体的类。我之前使用的是 union ,但我将其转换为变体,因为 boost 序列化程序对变体类型的序列化具有开箱即用的支持。

问题是这个编译器错误:

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 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_,
4> 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>

下面是变体序列化的相关代码: ...

    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 ];

};

非常感谢您的帮助。

最佳答案

您的访问者的结果类型为 void,实际上它什么都不做。当你做的时候

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

您正在尝试序列化一个 void 值。如果 variant 有开箱即用的序列化支持,它应该足够了

ar & m_aValues;

关于c++ - 序列化 boost 变体;非常奇怪和迟钝的编译器错误(MSVC 2010),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8172543/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com