使用运算符 << >> 的 CArchive 序列化未找到采用 cArchive 类型的左手的运算符
Posted
技术标签:
【中文标题】使用运算符 << >> 的 CArchive 序列化未找到采用 cArchive 类型的左手的运算符【英文标题】:CArchive serialization with operators << >> no operator found which takes a left-hand of type cArchive 【发布时间】:2013-11-26 01:54:54 【问题描述】:按照本教程,http://msdn.microsoft.com/en-us/library/vstudio/3bfsbt0t.aspx 我实现了这段代码:
class Esame: public CObject
public:
INT voto;
INT crediti;
BOOL lode;
CString nome;
Esame()
Esame(CString nome, INT voto, BOOL lode, INT crediti) :nome(nome), voto(voto), lode (lode), crediti(crediti)
void Serialize(CArchive& ar);
protected:
DECLARE_SERIAL(Esame)
;
IMPLEMENT_SERIAL(Esame, CObject, 1)
void Esame::Serialize(CArchive& ar)
CObject::Serialize(ar);
if (ar.IsStoring())
ar << voto << lode << crediti;
else
ar >> voto >> lode >> crediti;
然后我打电话:
CFile file(_T("file.and"), CFile::modeCreate);
CArchive afr(&file, CArchive::store);
Esame e;
afr << e;
但我明白了
【问题讨论】:
【参考方案1】:这是因为您没有为您的班级 Esame
提供重载 operator<<
。您链接到的文章也没有这样做,所以也许您打算这样做:
CFile file(_T("file.and"), CFile::modeCreate);
CArchive afr(&file, CArchive::store);
Esame e;
e.Serialize(ar);
因此,您直接调用Serialize
函数,您的类中的实现使用operator<<
序列化所需的原始成员变量并在其他复杂对象上调用Serialize
。
如教程所示:
void CCompoundObject::Serialize( CArchive& ar )
CObject::Serialize( ar ); // Always call base class Serialize.
m_myob.Serialize( ar ); // Call Serialize on embedded member.
m_pOther->Serialize( ar ); // Call Serialize on objects of known exact type.
// Serialize dynamic members and other raw data
if ( ar.IsStoring() )
ar << m_pObDyn;
// Store other members
else
ar >> m_pObDyn; // Polymorphic reconstruction of persistent object
//load other members
【讨论】:
好的,但是我失去了使用 CArchive 的“舒适性”:我可以简单地为任何祖先类重载 >; CArchive 的帮助将是(我相信)自动执行 > 运算符的重载(我认为这是由 DECLARE_SERIAL 和 IMPLEMENT_SERIAL 宏完成的)。手动重载>通常是系统【参考方案2】:afr << &e;
需要指针类型。
【讨论】:
以上是关于使用运算符 << >> 的 CArchive 序列化未找到采用 cArchive 类型的左手的运算符的主要内容,如果未能解决你的问题,请参考以下文章