2012-07-20 35 views
3

我想使用boost.serialization与模板化容器类:当我使用STL容器作为模板参数,例如与STL容器作为模板使用boost.serialization参数

// MyContainer.h 

template<class T> struct MyContainer { 
    T t; 

    template<class Archive> 
    void serialize(Archive& archive, const unsigned version) { 
     archive & t; 
    } 
}; 

// Main.cpp 
... 
MyContainer<array<int,4>> mc; 
std::ofstream ofs("foo.bar"); 
boost::archive::binary_oarchive oa(ofs); 
oa << mc; 
... 

...的Visual Studio 11与以下错误消息抱怨:

'serialize' : is not a member of 'std::array<_Ty,_Size>' 

我曾尝试包括在这两个文件 “助推/系列化/ array.hpp”,但这并没有解决这个问题。此外,包括数组专业化不是我想要的,因为容器也可以容纳任何其他STL容器。

这样做的正确方法是什么?

回答

4

虽然serialiation/array.hppserialize()过载boost::array,它没有一个std::array

你应该能够使用make_array()而不是提供自己的serialize()超载:

namespace boost { 
namespace serialization { 

template<class Archive, class T, size_t N> 
void serialize(Archive & ar, std::array<T,N> & a, const unsigned int version) 
{ 
    ar & boost::serialization::make_array(a.data(), a.size()); 
} 

} // namespace serialization 
} // namespace boost 
+0

谢谢!这解决了编译错误。但是,如果模板参数是例如一张地图,还需要另一个专业化。有没有一种通用的方式来做到这一点? – untraceable 2012-07-21 04:24:57

+0

@untraceable:'map','set','vector'等已经被支持 - 包括'serialization/map.hpp'等。 – 2012-07-21 04:31:26

+0

所以基本上,如果我想用不同类型的MyContainer,返回MyContainer.h并包含适当的boost.serialization头文件?!在我看来,这种方式违背了泛型编程的目的:-) – untraceable 2012-07-21 04:50:17