【问题标题】:Compilation error with boost serializationboost序列化的编译错误
【发布时间】:2011-10-18 14:13:47
【问题描述】:

我创建了一个小样本来测试 boost 序列化库,但我遇到了编译问题。

首先,代码如下:

#include <iostream>
#include <fstream>
#include <iomanip>
#include <boost/filesystem/operations.hpp>
#include <boost/serialization/nvp.hpp>
#include <boost/filesystem/fstream.hpp>
#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/utility.hpp>
#include <boost/serialization/list.hpp>
#include <boost/serialization/version.hpp>

std::vector<uint8_t> buf;

class MyClass
{
public:
    MyClass(){};
    virtual ~MyClass(){};

    int assetStatus;

    friend class boost::serialization::access;

    template<typename Archive> void serialize(
        Archive & ar,
        const unsigned int version)
    {
        ar & BOOST_SERIALIZATION_NVP(assetStatus);
    }

    std::string ToString()
    {
        std::string toret;
        toret += " assetStatus: " + assetStatus;

        return toret;
    }
};

int main()
{
    MyClass a, b;
    a.assetStatus = 10;

    std::cout << a.ToString();

    boost::archive::xml_oarchive ooxml(std::ofstream(dbPath));
    ooxml << BOOST_SERIALIZATION_NVP(a); // error here

    MyClass d;
    boost::archive::xml_iarchive iixml(std::ifstream(dbPath));
    iixml >> BOOST_SERIALIZATION_NVP(d); // error here
    std::cout << d.ToString();
}

我在以下行收到编译错误:

ooxml << BOOST_SERIALIZATION_NVP(a);

iixml >> BOOST_SERIALIZATION_NVP(d);

错误是:

'iixml &gt;&gt; boost::serialization::make_nvp(const char*, T&amp;) [with T=MyClass(((MyClass&amp;)(&amp;d)))]' 中与operator&gt;&gt; 不匹配

你对这句话的含义有什么想法吗?

【问题讨论】:

    标签: c++ serialization boost boost-serialization


    【解决方案1】:

    看起来 dbPath 没有定义。此外,ooxml/iixml 的声明似乎不正确。

    尝试修改您的代码以执行以下操作: ...

    const char * dbPath = "file.xml"
    
    std::ofstream ofs(dbPath);
    boost::archive::xml_oarchive ooxml(ofs);
    ooxml << BOOST_SERIALIZATION_NVP(a); 
    
    std::ifstream ifs(dbPath);
    boost::archive::xml_iarchive iixml(ofs);
    iixml >> BOOST_SERIALIZATION_NVP(d); 
    

    【讨论】:

    • 是的,我在复制/粘贴时忘记了那部分,但它是在我的代码中定义的。关于另一部分,我已经这样改了,发现这是正确的解决方案,尽管我不明白哪个是不同的......
    【解决方案2】:

    我认为不支持读取 NVP(名称值对)(即使用 iixml),请使用 &(而不是 >>)或 iixml >> d;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      • 1970-01-01
      • 2016-02-28
      • 2013-01-29
      相关资源
      最近更新 更多