boost::shared_ptr
boost::shared_ptrのトラッキングレベルはboost::shared_ptr
// correct shared_ptr serialization depends upon object tracking // being used. BOOST_STATIC_ASSERT( boost::serialization::tracking_level< T >::value != boost::serialization::track_never );
と書いてあります。
一方で、組み込み型のトラッキングレベルはboost::serialization::track_neverであるという仕様になっています。*1
よって「boost::shared_ptr
解決方法は、intをラップしたユーザー定義型を作り、それをboost::shared_ptrの要素の型にします。 例えば
struct Integer { int held = 0; operator int() const { return held; } Integer(int value) : held(value) {} Integer() = default; };
のようなクラスを作り、それをshared_ptrの要素の型にします。この方法はboost/serialization/shared_ptr.hppの88行目や135行目に下のように書かれています。
// The most common cause of trapping here would be serializing // something like shared_ptr<int>. This occurs because int // is never tracked by default. Wrap int in a trackable type BOOST_STATIC_ASSERT((tracking_level< T >::value != track_never));
当然ですが、これはint型に限った話ではなく、組み込み型のboost::shared_ptrを作成するときに当てはまります。
*1:http://www.boost.org/doc/libs/1_55_0/libs/serialization/doc/index.htmlのReference>Serializable Concept>Class Serialization TraitsのページのObject TrackingセクションにDefault tracking traits are: For primitive, track_never.とあります