![](/img/trans.png)
[英]error C2182: '*' : illegal use of type 'void' c:\boost_1_53_0\boost\smart_ptr\intrusive_ptr.hpp
[英]C++ non intrusive boost serialization of a boost::smart_ptr
我正在嘗試對無法使用boost :: serialization進行修改的自定義類進行序列化 ,並且需要將邏輯/計算代碼與序列化部分分開。 它有一些我必須序列化的保護和私有字段,其中一些是其他類的boost :: shared_ptr 。
就像是:
// computational classes
class A
{
public:
A(int a) : m_val(a) {}
private:
int m_val
};
class B
{
public:
B(a) : m_ptr(new A(a)) {}
private:
boost::shared_ptr< A > m_ptr;
};
我發現一種簡單的解決方法可以序列化類A,僅在其定義中添加“朋友類”:
class A_ser;
class A
{
friend class A_ser;
//...
};
並添加一個代理類以對其進行序列化,該類具有對A類字段的引用:
class A_ser
{
public:
A_ser(A & a) : m_val(A.m_val) {}
template< class Archive >
void serialize(Archive & ar, const unsigned int version)
{
ar & m_val;
}
private:
int & m_val;
};
namespace boost {
namespace serialization {
template< class Archive >
void serialize(Archive & ar, A & a, const unsigned int version)
{
A_ser sa(a);
ar & sa;
}
} // namespace serialization
} // namespace boost
因此,當在A上調用序列化方法時,將使用A_ser的方法。
當我嘗試對類B執行相同操作時,會出現問題,因為在其反序列化過程中,它嘗試調用未定義的構造函數A():
boost / serialization / access.hpp:132:錯誤:沒有匹配的函數可以調用'A :: A()'
如果我嘗試將默認參數放入A的構造函數中,它只會初始化一個全新的空類。
哦,我使用的是Boost 1.53.0。
提前謝謝了。
編輯:解決方案(它是如此簡單..)
只需修改* _ser引用
class A_ser
{
public:
A_ser(A & a) : m_a(A) {}
template< class Archive >
void serialize(Archive & ar, const unsigned int version)
{
ar & m_a.m_val;
}
private:
A & m_a;
};
並添加
template< class Archive >
void load_construct_data(Archive & /*ar*/, A * t, unsigned /*v*/)
{
::new(t) A(0);
}
問題解決了(感謝阿倫)!
您可以通過使用boost方法序列化非默認可構造對象來解決該問題。 Google提供了save_construct_data和load_construct_data用法示例。
還可以查看將序列化為保存/加載 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.