2012-07-20 73 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