CArray<int,int> serialize



  • Nein, in der Serialize()-Methode deiner Klasse rufst du das Serialize() des CArray's auf - und das wiederum greift intern auf (die globale Funktion) SerializeElements<>() zurück (bzw. auf die angegebene Spezialisierung dieser Funktion).



  • Hi,

    vielen Dank jetzt ist mir einiges klarer geworden. Könntest du mir vlt noch sagen wie ich die deklarieren soll in der .h und .cpp meiner klasse?

    .h
    template <> void AFXAPI SerializeElements <int> ( CArchive& ar,
    int* pData, int nCount )

    .cpp

    template <> void AFXAPI MeineKlasse::SerializeElements <int> ( CArchive& ar,
    int* pData, int nCount )
    {
    for ( int i = 0; i < nCount; i++)
    {
    if(ar.IsStoring())
    ar<<pData[i]<<" ";
    else
    ar>>pData[i];
    }
    }

    Noch ne frage. Wenn ich ein CArray<CPoint,CPoint> funktioniert das dann genauso? Weil CPoint den operato << >> nicht kennt?

    mfg



  • meeper schrieb:

    Hi,

    vielen Dank jetzt ist mir einiges klarer geworden. Könntest du mir vlt noch sagen wie ich die deklarieren soll in der .h und .cpp meiner klasse?

    .h
    template <> void AFXAPI SerializeElements <int> ( CArchive& ar,
    int* pData, int nCount )

    .cpp

    template <> void AFXAPI MeineKlasse::SerializeElements <int> ( CArchive& ar,
    int* pData, int nCount )
    {
    for ( int i = 0; i < nCount; i++)
    {
    if(ar.IsStoring())
    ar<<pData[i]<<" ";
    else
    ar>>pData[i];
    }
    }

    Ja, so sollte es aussehen - allerdings mit einem Semikolon am Ende der Deklaration (in der .h)

    Noch ne frage. Wenn ich ein CArray<CPoint,CPoint> funktioniert das dann genauso? Weil CPoint den operato << >> nicht kennt?

    Nein, bei einem CPoint mußt du die einzelnen Teile (x und y) getrennt schreiben bzw. lesen (und auch wenn's nicht in der MSDN steht, ein CPoint erbt öffentlich von POINT - damit kannst du auf dessen Member direkt zugreifen).



  • Hi,

    ich habs jetzt mal so deklariert aber leider bekomme ich compilerfehler..

    mfg



  • Und welche? (ich hab' keine Lust, die gesamte Liste von C1001 bis C4904 durchzugehen, welcher auf dein Problem passen könnte)



  • error C3412: 'MeineKlasse::SerializeElements':Vorlage in aktuellem Bereich kann nicht spezialisiert werden

    in der .h ist das problem anscheinend.



  • Ups, da hatte ich doch etwas übersehen, was ich vorhin eigentlich schon erwähnt hatte: SerializeElements() ist eine globale Funktion und hat in deiner Klasse nichts zu suchen.



  • Ja aber ich muss die doch irgendwie überschreiben? Wie mache ich den das?

    mfg



  • Global:

    //.h:
    template <> void AFXAPI SerializeElements <int> ( CArchive& ar, 
    int* pData, int nCount );
    
    class MeineKlasse {...};
    
    //.cpp 
    template <> void AFXAPI SerializeElements <int> ( CArchive& ar, int* pData, int nCount ) 
    { 
      for ( int i = 0; i < nCount; i++) 
      { 
        if(ar.IsStoring()) 
          ar<<pData[i]<<" "; 
        else 
          ar>>pData[i]; 
      } 
    }
    

    (wobei du den Prototyp eventuell sogar weglassen kannst)



  • Hi,

    hab das jetzt so gemacht. Jetz mault der compiler rum das die Serializelements schon in der doc definiert ist. Liegt das vlt daran das ich dort MeineKlasse includiere. Wobei sich dann wieder die Frage stellt wie kann ich das verhindern, dass der compiler da nicht meckert.

    mfg



  • Ich hoffe mal nicht, daß du die .cpp Datei irgendwo includet hast. Ansonsten sollte (zumindest nach meinem Verständnis) die Deklaration der SerializeElements keine Probleme verusachen.

    PS: Wer genau beschwert sich? Der Compiler (Cxxxx) oder der Linker (LNKxxx)?



  • Der Linker

    mfg



  • In der doc wird die meineklasse.h includiert...



  • Hmm, eventuell solltest du den Code mal im Zusammenhang zeigen.



  • meineklasse.h

    class meineklasse{

    }

    meineklasse.cpp

    template <> void AFXAPI SerializeElements <int> ( CArchive& ar, int* pData, int nCount )
    {
    for ( int i = 0; i < nCount; i++)
    {
    if(ar.IsStoring())
    ar<<pData[i]<<" ";
    else
    ar>>pData[i];
    }
    }

    doc.cpp

    #include "MeineKlasse.h"



  • Also dort sehe ich nichts, worüber der Linker stolpern könnte. Entweder du hast den Code zu sehr gekürzt oder du hast ein anderes Problem, das nichts mit der Serialisierung zu tun hat.

    (PS nur für die Zukunft: sfds)



  • Habe gerade gemerkt das ich die meineklasse.h auch im view includiere... Könnte das ein problem sein? Das komische ist das der linker anzeigt es wäre in einer klasse schon definiert,wo die serializelements gar nicht vorhanden ist.

    mfg



  • Ey such mal danach bei google



  • Eyh habe ich schon kann da aber nicht brauchbares daraus schliessen...


Anmelden zum Antworten