使用运算符 << >> 的 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&lt;&lt;。您链接到的文章也没有这样做,所以也许您打算这样做:

CFile file(_T("file.and"), CFile::modeCreate);
CArchive afr(&file, CArchive::store);
Esame e;
e.Serialize(ar);

因此,您直接调用Serialize 函数,您的类中的实现使用operator&lt;&lt; 序列化所需的原始成员变量并在其他复杂对象上调用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 类型的左手的运算符的主要内容,如果未能解决你的问题,请参考以下文章

使用运算符 << >> 的 CArchive 序列化未找到采用 cArchive 类型的左手的运算符

JS使用三元运算符判断三个数中最大的数

比较运算符的性能(>、>=、<、<=)

是否可以优化使用“<>”运算符的查询?

在 Java 中使用“<”或“>”运算符比较两个对象

在所有的关系运算符(>=、>、==、!=、<=、<)中,优先级最低的运算符是“==、!=”?