首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Boost序列化boost::数组失败

Boost序列化boost::数组失败
EN

Stack Overflow用户
提问于 2021-09-14 11:43:56
回答 2查看 222关注 0票数 1

我正在尝试这个链接的示例:https://theboostcpplibraries.com/boost.serialization-wrappers

但是,直接序列化boost::array编译的示例失败了:

代码语言:javascript
复制
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/array.hpp>
#include <iostream>
#include <sstream>

using namespace boost::archive;

std::stringstream ss;

void save()
{
  text_oarchive oa{ss};
  boost::array<int, 3> a{{0, 1, 2}};
  oa << a;
}

void load()
{
  text_iarchive ia{ss};
  boost::array<int, 3> a;
  ia >> a;
  std::cout << a[0] << ", " << a[1] << ", " << a[2] << '\n';
}

int main()
{
  save();
  load();
}

错误代码的一部分显示如下:

代码语言:javascript
复制
In files included from /usr/local/lib/libboost1.65.1/include/boost/serialization/extended_type_info_typeid.hpp:37:0,
/usr/local/lib/libboost1.65.1/include/boost/archive/detail/oserialzer.hpp:39,
/usr/local/lib/libboost1.65.1/include/boost/archive/detail/interface_oarchive.hpp:23,
/usr/local/lib/libboost1.65.1/include/boost/archive/detail/common_oarchive.hpp:22,
/usr/local/lib/libboost1.65.1/include/boost/archive/basic_text_oarchive.hpp:29,
/usr/local/lib/libboost1.65.1/include/boost/archive/text_oarchive.hpp:31,
from test.cpp:1:

/usr/local/lib/libboost1.65.1/include/boost/serialization/access.hpp: In instantiation of 'static void boost:serialization::access::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive; T = boost_array<int, 3ul>]':
/usr/local/lib/libboost1.65.1/include/boost/serialization/serialization.hpp:68:69: required from 'void boost:serialization::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive; T = boost_array<int, 3ul>]'
/usr/local/lib/libboost1.65.1/include/boost/serialization/serialization.hpp:126:23: required from 'void boost:serialization::serialize_adl(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive; T = boost_array<int, 3ul>]'
..................
test.cpp:15:9: required from here
/usr/include/boost/serialization/access.hpp:116:9: error: 'class boost::array<int, 3ul>' has no member named serialize'
   t.serialize(ar, file_version);
   ^

我的系统配置:Ubuntu18.04+ Boost 1.65.1

我已经在lib路径/usr/local/ lib /libbost1.65.1/中手动安装了boost 1.65.1,在lib路径/usr/lib/x86_64-linux-gnu/中安装了boost 1.65.1。不幸的是,两个编译的库都以相同的错误失败。

但是,如果boost数组使用包装器函数boost::serialization::make_array(),它将编译OK并工作。

代码语言:javascript
复制
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/array.hpp>
#include <array>
#include <iostream>
#include <sstream>

using namespace boost::archive;

std::stringstream ss;

void save()
{
  text_oarchive oa{ss};
  std::array<int, 3> a{{0, 1, 2}};
  oa << boost::serialization::make_array(a.data(), a.size());
}

void load()
{
  text_iarchive ia{ss};
  std::array<int, 3> a;
  ia >> boost::serialization::make_array(a.data(), a.size());
  std::cout << a[0] << ", " << a[1] << ", " << a[2] << '\n';
}

int main()
{
  save();
  load();
}

否则我会手动更改行

代码语言:javascript
复制
oa << a;

代码语言:javascript
复制
ia >> a;

代码语言:javascript
复制
oa << boost::serialization::make_array(a.data(), a.size());

代码语言:javascript
复制
ia >> boost::serialization::make_array(a.data(), a.size());

它也会编译好的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-14 12:30:23

全局变量ss会引发危险信号。以这种方式分享可能会产生意想不到的后果:

  • 首先,住宅的内容可能仍然存在。
  • 更微妙的是,在需要时可能没有同花顺。

此外,您似乎缺少了用于数组序列化的include:

代码语言:javascript
复制
#include <boost/serialization/boost_array.hpp>

将其添加为使其编译,但我们还将修复函数接口以删除全局的:

住在Coliru

代码语言:javascript
复制
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/array.hpp>
#include <boost/serialization/array.hpp>
#include <boost/serialization/boost_array.hpp>
#include <iostream>
#include <sstream>

std::string save()
{
    std::ostringstream            ss;
    boost::archive::text_oarchive oa{ss};

    boost::array<int, 3> a{{0, 1, 2}};
    oa << a;

    return std::move(ss).str();
}

void load(std::string text)
{
    std::istringstream ss(std::move(text));
    boost::archive::text_iarchive ia{ss};

    boost::array<int, 3> a;
    ia >> a;
    std::cout << a[0] << ", " << a[1] << ", " << a[2] << '\n';
}

int main()
{
    auto text = save();
    load(text);
}

打印

代码语言:javascript
复制
0, 1, 2
票数 0
EN

Stack Overflow用户

发布于 2021-09-16 09:53:22

我发现了这个错误的根本原因:我使用的gcc和g++版本是tooooo : g++ 4.8.0。Ubuntu18.04中的默认gcc和g++版本为7.5.0

我之所以使用g++ 4.8.0,是因为我想在我的Ubuntu中安装阿波罗自动驾驶工具包。然后,我也想在我的Ubuntu中尝试LIO映射工具包。但是出现了致命的错误,即LIO以及诸如Boost、gtsam和ROS这样的依赖项无法由g++ 4.8.0编译。

因此,请注意编译环境。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69177143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档