C++ 串行化boost变量;非常奇怪且迟钝的编译器错误(MSVC 2010)

C++ 串行化boost变量;非常奇怪且迟钝的编译器错误(MSVC 2010),c++,visual-c++,serialization,boost,variant,C++,Visual C++,Serialization,Boost,Variant,我正在尝试序列化一个包含boost变量的类,以存储在嵌入式MYSQL数据库中。我以前使用的是union,但我将其转换为variant,因为boost序列化程序对variant类型的序列化提供了现成的支持 问题在于此编译器错误: 4>default : error : 'which' out of range."); 4> ^ 4> detected during: 4> instantiati

我正在尝试序列化一个包含boost变量的类,以存储在嵌入式MYSQL数据库中。我以前使用的是union,但我将其转换为variant,因为boost序列化程序对variant类型的序列化提供了现成的支持

问题在于此编译器错误:

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>  
4>默认值:错误:'哪个'超出范围');
4>                 ^
4> 在以下期间检测到:
4> 实例化“Visitor::result\u type boost::detail::variant::Visition\u impl(int,int,Visitor&,VoidPtrCV,boost::mpl::false,NoBackupFlag,Which*,step0*)[Which=boost::mpl::int\,step0=boost::detail::variant::vision\u impl\u step boost::l\u iter>,Visitor=boost::detail::variant::destructor,VoidPtrCV=void*,NoBackupFlag=boost::variant boost::detail::variant::void\,boost::detail::variant::void\,boost::detail::variant::void\,boost::detail::variantant::void\,boost::detail::variant::void\,boost::detail::variant::void\,boost::detail::variant::void\>::在“.\..\extern\boost/variant/variant.hpp”的第1802行具有“回退类型”
4> 实例化“Visitor::result\u type boost::variant::internal\u apply\u Visitor\u impl(int,int,Visitor&,VoidPtrCV)[使用T0=u32={unsigned int},T1=i32={int},T2=f32={float},T3=boost::detail::variant::void\uUt4=boost::variant::void\uUt5=boost::detail::variant::void\uUt6=boost::variant::variant::void\uUt7=boost::detail::variant::variant::void\uUt8=boost::detail::variant::variant::VA,
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 ];

};
模板
无效序列化(存档和ar,常量未签名整数版本)
{
ar&m_名称;
ar&m_apszEnumOptions;
应收账款和应收账款价值;
ar&m_aValues;
ar&m_旗;
ar&m_型;
ar&m_pszName;
ar&sm_KPSzValue1名称;
ar&sm_kpszValue2Name;
ar&sm_kpszValue3Name;
ar&sm_kpszValue4Name;
}
受保护的:
静态pcstr sm_kpszValue1Name;
静态pcstr sm_kpszValue2Name;
静态pcstr sm_kpszValue3Name;
静态pcstr sm_kpszValue4Name;
pcstr m_pszName;
u32 m_型;
u32 m_旗;
typedef boost::变量值;
值m_aValues[值::计数];
std::string m_asValues[Values::Count];
const pcstr*m_apszEnumOptions;
pcstr m_apszValueNames[值::计数];
};

非常感谢您的帮助。

您的访问者属于结果类型
void
,实际上它什么也不做。如果您这样做

ar & boost::apply_visitor( variant_visitor(), m_aValues );
您正在尝试序列化一个
void
值。如果
variant
具有现成的序列化支持,那么就足够了

ar & m_aValues;

你知道visitor什么都不做,对吧?谢谢你指出这一点。我删除了visitor函数,但错误是一样的。@superstatic:你确定这就是导致错误的原因吗?如果你注释那一行,错误会消失吗?我删除了我正在使用的类中对变量的所有引用,看起来我甚至不能声明a一系列变量没有引起问题。boost::variant m_aValue[Values::Count];//错误这会在第264行的boost\variant\detail\visitation_impl.hpp中触发一个断言有什么想法吗?请注意,如果变量没有触发相同的行为,我根本无法添加变量。boost::variant m_aValue;