使用boost库在队列和堆栈数据结构上保存和加载数据时出错

时间:2018-01-27 12:46:43

标签: c++ boost stl

我是使用boost序列化库的新手。

我想使用text_iarchive和text_oarchive在STL结构中保存和加载数据。

maplistdequesetvector上,queue和{{1}没有任何问题我收到以下错误:

stack

我使用了以下代码:

error: no matching function for call to 'save(boost::archive::text_oarchive&, const std::deque<PKT_UNIT, std::allocator<PKT_UNIT> >&, const unsigned int&)' 
error: no matching function for call to 'load(boost::archive::text_iarchive&, std::deque<PKT_UNIT, std::allocator<PKT_UNIT> >&, const unsigned int&)'

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

堆栈和队列不是容器。它们是容器适配器。

按照设计,他们不会公开 raw 对底层容器的访问权限,但底层容器可序列化的标准库容器(vector<>和{{1} ,默认情况下分别)。

Boost序列化使用派生类的技巧来访问the underlying container ::c

由于围绕确切的实例化规则和模板排序的技术性,在容器的序列化代码之前,底层容器的序列化代码可见(声明)至关重要。适配器。

  

事实上,clang在这里有一个非常贴切的信息:

     

deque<>

     

问题当然是由于boost/serialization/queue.hpp|40 col 9| error: call to function 'save' that is neither visible in the template definition nor found by argument-dependent lookupload函数无法与容器一起放入其声明命名空间这一事实,因为那是save命名空间。 / p>

修复

在默认情况下,这意味着您需要在::stddeque之前包含stack的序列号:

queue

<强> Live On Coliru

#include <boost/serialization/deque.hpp>

#include <boost/serialization/stack.hpp>
#include <boost/serialization/queue.hpp>

#include <boost/archive/text_oarchive.hpp> #include <boost/archive/text_iarchive.hpp> #include <boost/serialization/deque.hpp> #include <boost/serialization/stack.hpp> #include <boost/serialization/queue.hpp> struct mystruct { std::stack<int> _s; std::queue<int> _q; void foo() { _s.push(1); _s.push(2); _s.push(3); _q.push(1); _q.push(2); _q.push(3); } template <typename Ar> void serialize(Ar& ar, unsigned /*version*/) { ar & _s & _q; } }; #include <fstream> int main() { { mystruct test; std::ofstream ofs("filename.dat"); boost::archive::text_oarchive oa(ofs); oa << test; } { std::ifstream ifs("filename.dat"); boost::archive::text_iarchive ia(ifs); mystruct restored; ia >> restored; } } 包含

filename.dat

在现场演示中

答案 1 :(得分:0)

@sehe不幸的是我无法在coliru查看器上运行我的代码然后我在这里发布。虽然描述起来很简单。 当我使用下面的标题顺序时,我得到了text_iarchive和text_oarchive中提到的堆栈和队列结构的两个错误:

#include <boost/serialization/vector.hpp>
#include <boost/serialization/set.hpp>
#include <boost/serialization/map.hpp>
#include <boost/serialization/list.hpp>
#include <boost/serialization/queue.hpp>
#include <boost/serialization/stack.hpp>
#include <boost/serialization/deque.hpp>

但是当我用这个订单问题解决了

#include <boost/serialization/vector.hpp>
#include <boost/serialization/set.hpp>
#include <boost/serialization/map.hpp>
#include <boost/serialization/list.hpp>
#include <boost/serialization/deque.hpp>
#include <boost/serialization/queue.hpp>
#include <boost/serialization/stack.hpp>