我在界面画完图形后,我想把这个保存。其实我自己定义了一个CGraphicElement类,这个类的构造函数函数为:
CGraphicElement::CGraphicElement(sGraphicFormat geFmt,sGraphicHeader geHdr,sPointPosition * psPstn)
其实sGraphicFormat,sGraphicHeader和sPointPosition都是自己写的结构体。
还有一个CTypedPtrArray<CObArray,CGraphicElement*> sogOA用来保存画好的数据。
然后我在CGraphicElement类中写了一个Serialize函数:
void CGraphicElement::Serialize(CArchive& ar)
{
if(ar.IsStoring())
{
ar<<geFormat<<geHeader<<sPntPosition;
}
else
{
ar>>geFormat>>geHeader>>sPntPosition;
}
}
调试出线了两个错误,
error C2678: 二进制“<<”: 没有找到接受“CArchive”类型的左操作数的运算符(或没有可接受的转换)
error C2679: 二进制“>>”: 没有找到接受“sGraphicFormat”类型的右操作数的运算符(或没有可接受的转换)
这个问题要怎么解决啊?

解决方案 »

  1.   

    CArchive并不支持结构体的直接序列化, 要在你的几个结构体重写序列化操作符 
    void operator << (CArchive& ar)
    {
      ……//保存代码
    }
    void operator >> (CArchive& ar)
    {
      ……//读取代码
    }
      

  2.   

    举个例子struct _testStruct
    {
    int iVal;
    long lVal;
    }testStruct;CArchive& AFXAPI operator<<(CArchive& ar, _testStruct &_tstruct)
    {
    return ar << _tstruct.iVal << _tstruct.lVal;
    }CArchive& AFXAPI operator>>(CArchive& ar, _testStruct &_tstruct)
    {
    return ar >> _tstruct.iVal >> _tstruct.lVal;
    }
    // CSDI_1Doc 序列化
    void CSDI_1Doc::Serialize(CArchive& ar)
    {
    if (ar.IsStoring())
    {
    // TODO: 在此添加存储代码
    int iVal =1;
    ar << iVal << testStruct;
    }
    else
    {
    // TODO: 在此添加加载代码
    int iVal;
    ar >> iVal >> testStruct;
    }
    }
      

  3.   

    楼上正解,自己的类需要重载操作符,感觉楼主对操作符也不熟悉,要么索性别用Operator了,自己写数据加载和拷贝函数