我是使用boost序列化库的新手。
我想使用text_iarchive和text_oarchive在STL结构中保存和加载数据。
在map
,list
,deque
,set
和vector
上,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&)'
我该如何解决这个问题?
答案 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 lookup
和load
函数无法与容器一起放入其声明命名空间这一事实,因为那是save
命名空间。 / p>
在默认情况下,这意味着您需要在::std
或deque
之前包含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>