提升的简单扩展::存档::text_oarchive

Simple extension of boost::archive::text_oarchive

本文关键字:存档 text oarchive 扩展 简单      更新时间:2023-10-16

我正在尝试将成员变量添加到 Boost 存档类中。在此之后,我想出了:

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <fstream>
class MyOArchive : public boost::archive::text_oarchive_impl<MyOArchive>
{
public:
    bool MyData;
    friend class boost::archive::detail::common_oarchive<MyOArchive>;
    friend class basic_text_oarchive<MyOArchive>;
    //friend class boost::serialization::save_access; // save_access in namespace boost::serialization does not name a type
    MyOArchive(std::ostream& os, unsigned int flags = 0) : boost::archive::text_oarchive_impl<MyOArchive>(os, flags) {}
};
class MyClass
{
public:
private:
    friend class boost::serialization::access;
    double Value;
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & Value;
    }
};

int main()
{
    MyClass myClass;
    std::ofstream outputStream("test.txt");
    //boost::archive::text_oarchive outputArchive(outputStream);
    MyOArchive outputArchive(outputStream);
    outputArchive << myClass;
    outputStream.close();
    return 0;
}

但是,我收到链接器错误:

undefined reference to boost::archive::text_oarchive_impl<MyOArchive>::text_oarchive_impl(std::ostream&, unsigned int)

谁能解释一下这里出了什么问题?我不需要重新实现存档的任何功能,只需附加此成员MyData即可。

啊。发现了它。

您需要将基本实现的ipp包含在链接到最终产品的一个 TU 中。

#include <boost/archive/impl/basic_text_oarchive.ipp>
#include <boost/archive/impl/text_oarchive_impl.ipp>

此外,save_access住在不同的城堡命名空间中:

friend class boost::archive::save_access;

住在科里鲁

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/impl/basic_text_oarchive.ipp>
#include <boost/archive/impl/text_oarchive_impl.ipp>
#include <fstream>
class MyOArchive : public boost::archive::text_oarchive_impl<MyOArchive> {
  public:
    bool MyData;
    friend class boost::archive::detail::common_oarchive<MyOArchive>;
    friend class basic_text_oarchive<MyOArchive>;
    friend class boost::archive::save_access;
    MyOArchive(std::ostream &os, unsigned int flags = 0) : boost::archive::text_oarchive_impl<MyOArchive>(os, flags) {}
};
class MyClass {
  private:
    friend class boost::serialization::access;
    double Value;
    template <class Archive> void serialize(Archive &ar, unsigned) { ar &Value; }
};
int main() {
    MyClass myClass;
    {
        std::ofstream outputStream("test.txt");
        MyOArchive outputArchive(outputStream);
        outputArchive << myClass;
    }
}

输出为

22 serialization::archive 13 0 0 6.95328877045326431e-310