Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 多态类的Boost XML存档编译错误_C++_Serialization_Boost - Fatal编程技术网

C++ 多态类的Boost XML存档编译错误

C++ 多态类的Boost XML存档编译错误,c++,serialization,boost,C++,Serialization,Boost,我正在尝试使用boost归档以XML格式保存文件 我在编译时得到这两个错误 错误C2664“int boost::mpl::assertion_failed(boost::mpl::assert::type)”:无法将参数1从“boost::mpl::failed***************boost::serialization::is_wrapper:::************”转换为“boost::mpl::assert::type” 错误C2789“第6行中的mpl\U断言”:必须

我正在尝试使用boost归档以XML格式保存文件

我在编译时得到这两个错误

  • 错误C2664“int boost::mpl::assertion_failed(boost::mpl::assert::type)”:无法将参数1从“boost::mpl::failed***************boost::serialization::is_wrapper:::************”转换为“boost::mpl::assert::type”

  • 错误C2789“第6行中的mpl\U断言”:必须初始化常量限定类型的对象

  • 这是因为这两条线

    BOOST_CLASS_EXPORT_GUID(SumKeyframeXYZ, "SumKeyframeXYZ")
    BOOST_CLASS_EXPORT_GUID(SumPosition_Channel, "SumPosition_Channel")
    
    这是主要功能

    #include "Container.h"
    
    BOOST_CLASS_EXPORT_GUID(SumKeyframeXYZ, "SumKeyframeXYZ")
    BOOST_CLASS_EXPORT_GUID(SumPosition_Channel, "SumPosition_Channel")
    
    int main()
    {
        std::ofstream ofs("D:\\output.xml");
        Container cont;
        cont.AddPositionChannel();
        boost::archive::xml_oarchive oa(ofs);
        oa << BOOST_SERIALIZATION_NVP(cont);
        return 0;
    }
    
    #包括“Container.h”
    BOOST_CLASS_EXPORT_GUID(SumKeyframeXYZ,“SumKeyframeXYZ”)
    BOOST_CLASS_EXPORT_GUID(SumPosition_通道,“SumPosition_通道”)
    int main()
    {
    std::ofs流(“D:\\output.xml”);
    集装箱运输;
    cont.AddPositionChannel();
    boost::archive::xml_oarchive oa(ofs);
    oa posChannel=std::使_共享();
    通道。推回(posChannel);
    };
    私人:
    好友类boost::serialization::access;
    模板无效序列化(存档和应收账款),
    常量无符号整数版本)常量{
    ar&BOOST_序列化_NVP(标准域名);
    ar和BOOST_序列化_NVP(通道);
    }
    };
    
    //////////////////////////////////////////////////////////

    SumChannel.h

    #include <fstream>
    #include <iostream>
    #include <boost/archive/xml_iarchive.hpp>
    #include <boost/archive/xml_oarchive.hpp>
    #include <boost/serialization/vector.hpp>
    
    class SumChannel
    {
    public:
        float offset;
    
        SumChannel() { offset = 1.0; }
    
    private:
    
        friend class boost::serialization::access;
    
        template<class Archive> void serialize(Archive & ar,
            const unsigned int version) const {
                ar & BOOST_SERIALIZATION_NVP(offset);   
        }
    };
    
    #包括
    #包括
    #包括
    #包括
    #包括
    类SumChannel
    {
    公众:
    浮动偏移量;
    SumChannel(){offset=1.0;}
    私人:
    好友类boost::serialization::access;
    模板无效序列化(存档和应收账款),
    常量无符号整数版本)常量{
    ar和BOOST_序列化_NVP(偏移);
    }
    };
    
    苏木海峡

    #include "SumKeyframeXYZ.h"
    #include "SumChannel.h"
    #include <vector>
    #include <boost/archive/xml_iarchive.hpp>
    #include <boost/archive/xml_oarchive.hpp>
    #include <boost/serialization/vector.hpp>
    
    class SumPosition_Channel : public SumChannel
    {
    public:
        std::vector<SumKeyframeXYZ>  keyframes;
    
        void AddKeyframe() { SumKeyframeXYZ key; keyframes.push_back(key); }
    
    private:
        friend class boost::serialization::access;
        
        typedef SumChannel _Super;
        template<class Archive> void serialize(Archive & ar,
            const unsigned int version) const {
            ar & boost::serialization::base_object<_Super>(*this);
            ar & BOOST_SERIALIZATION_NVP(keyframes);
        }
    };
    
    #包括“SumKeyframeXYZ.h”
    #包括“SumChannel.h”
    #包括
    #包括
    #包括
    #包括
    类别SUMU频道:公共SUMU频道
    {
    公众:
    std::向量关键帧;
    void AddKeyframe(){SumKeyframeXYZ键;关键帧。向后推(键);}
    私人:
    好友类boost::serialization::access;
    typedef SumChannel\u Super;
    模板无效序列化(存档和应收账款),
    常量无符号整数版本)常量{
    ar&boost::serialization::base_对象(*this);
    ar和BOOST_序列化_NVP(关键帧);
    }
    };
    
    关键帧基

    #include <iostream>
    #include <fstream>
    
    #include <boost/archive/xml_oarchive.hpp>
    #include <boost/archive/xml_iarchive.hpp>
    class Keyframebase
    {
    public:
        std::string stdstrName;
        float time;
    
        Keyframebase() { stdstrName = "BaseKey"; time = 50.0; }
        
    private:
    
        friend class boost::serialization::access;
    
        template<class Archive> void serialize(Archive & ar,
            const unsigned int version) {
            ar & BOOST_SERIALIZATION_NVP(stdstrName);
            ar & BOOST_SERIALIZATION_NVP(time);
        }
    
    };
    
    #包括
    #包括
    #包括
    #包括
    类关键帧基
    {
    公众:
    std::字符串stdstrName;
    浮动时间;
    Keyframebase(){stdstrName=“BaseKey”;time=50.0;}
    私人:
    好友类boost::serialization::access;
    模板无效序列化(存档和应收账款),
    常量(无符号整数版本){
    ar&BOOST_序列化_NVP(标准域名);
    ar和BOOST_序列化_NVP(时间);
    }
    };
    
    苏门答腊

    #include "KeyframeBase.h"
    #include <boost/archive/xml_iarchive.hpp>
    #include <boost/archive/xml_oarchive.hpp>
    #include <boost/serialization/vector.hpp>
    
    class SumKeyframeXYZ : public Keyframebase
    {
    public:
        float x;
        float y;
        float z;
    
        SumKeyframeXYZ() { x = 150.0; y = 200.0; z = 300.0; }
    
    private:
        friend class boost::serialization::access;
    
        template<class Archive> void serialize(Archive & ar,
            const unsigned int version) const {
            ar & boost::serialization::base_object<Keyframebase>(*this);
            ar & BOOST_SERIALIZATION_NVP(x);
            ar & BOOST_SERIALIZATION_NVP(y);
            ar & BOOST_SERIALIZATION_NVP(z);
        }
    };
    
    #包括“KeyframeBase.h”
    #包括
    #包括
    #包括
    类SumKeyframeXYZ:公共关键帧库
    {
    公众:
    浮动x;
    浮动y;
    浮动z;
    SumKeyframeXYZ(){x=150.0;y=200.0;z=300.0;}
    私人:
    好友类boost::serialization::access;
    模板无效序列化(存档和应收账款),
    常量无符号整数版本)常量{
    ar&boost::serialization::base_对象(*this);
    ar&BOOST_序列化_NVP(x);
    ar&BOOST_序列化_NVP(y);
    ar&BOOST_序列化_NVP(z);
    }
    };
    
    代码的问题是我没有将NVP写入基类

    我将基类归档代码从

      ar & boost::serialization::base_object<_Super>(*this);
    
    ar&boost::serialization::base_对象(*this);
    
    对于所有的基类,都要这样做

    typedef SumChannel _Super;
    ar & boost::serialization::make_nvp("SumChannel", boost::serialization::base_object<_Super>(*this));
    
    typedef SumChannel\u Super;
    ar&boost::serialization::make_nvp(“SumChannel”,boost::serialization::base_对象(*this));
    
    并从serilize函数中删除常量

    #include "Container.h"
    
    BOOST_CLASS_EXPORT_GUID(SumKeyframeXYZ, "SumKeyframeXYZ")
    BOOST_CLASS_EXPORT_GUID(SumPosition_Channel, "SumPosition_Channel")
    
    int main()
    {
        std::ofstream ofs("D:\\output.xml");
        Container cont;
        cont.AddPositionChannel();
        boost::archive::xml_oarchive oa(ofs);
        oa << BOOST_SERIALIZATION_NVP(cont);
        return 0;
    }