std::vector definieren



  • Hallo,

    ich habe folgendes Problem:

    In der MainForm definiere ich folgende Struktur:

    ...
    ...
    public:
      struct ndata
      {
        String profil;
        double tonnage;
        int anzahl;
      } cAvg;
    ...
    ...
    

    (in der Main.h)

    In mehreren MDI-Formularen möchte ich diese Struktur in std::vector nutzen.

    ...
    ...
    Taverage *average;
    
      std::vector<MainForm->cAvg> Durchschnitt;   // <-- diese Definition
    
      std::vector<double> chart_zoom;
    
    //---------------------------------------------------------------------------
    __fastcall Taverage::Taverage(TComponent* Owner)
      : TForm(Owner)
    {
    ...
    ...
    

    Beim Compilieren des MDI-Forms kommt der Compilerfehler
    E2401 Ungültige Template-Argumentliste

    Wenn ich die Struktur in der Form definiere, dann funktioniert das.

    Wo liegt mein Fehler???

    Gruß Udo



  • Hallo

    Natürlich muß die Struktur bei der Deklaration des vectors bekannt sein.
    Lagere die Struktur in eine extra Header-Datei aus und include diese von allen Stellen wo du sie brauchst.

    bis bald
    akari



  • Hallo,

    Das hier

    std::vector<MainForm->cAvg>
    

    kann eigentlich nicht funktionieren. Als Templateargument gibt man Typen an und keine Instanzen.
    Das sollte wohl eher so aussehen.

    std::vector<TMainForm::ndata>
    

    Ein Include ist hier übrigens nicht unbedingt nötig. Eine Forwarddeklaration reicht.



  • @Akari:
    Danke, das wars.

    Ich bin fälschlicherweise davon ausgegangen, das die Variable und damit auch die Struktur bekannt ist, wenn die Codevervollständigung funktioniert.

    Gruß Udo



  • @Braunstein:
    Zuerst hatte ich natürlich den Typ in der Deklaration stehen, aber das hat natürlich auch nicht funktioniert.

    Wo müßte denn die Forward-Deklaration stehen, in der MainForm oder ?

    Gruß Udo



  • Die müsste vor der Deklaration in der entsprechenden Headerdatei (MDI-Formular) stehen. Die Mainform kennt den Typ doch.



  • Hallo

    Nein eine Forward Declaration bringt hier nichts, da du ja nicht mit Pointern als Elementtyp arbeitest. Der Compiler muß den ganzen Elementtyp kennen.

    bis bald
    akari



  • Das ist in diesem Fall egal da es ja nur eine Deklaration ist. Auch bei Templateargumenten und Funktionsparametern genügen Forwarddeklarationen vor der Deklaration im Header. Spätestens bei der ersten Verwendung (z.Bsp. Konstruktor) muß der konkrete Typ aber bekannt sein.



  • Hallo

    Nein eine Forward Declaration reicht nicht aus. Einfacher Test :
    Neues Projekt, Zusätzliche Unit mit class Test...
    Dann in der Headerdatei der eigentlichen Hauptunit :

    #include <vector>
    ...
    class Test;
    std::vector<Test> test;
    ...
    

    Fehlermeldung vom Compiler :

    memory.stl : Undefinierte Struktur 'Test'

    Dabei spielt es auch keine Rolle ob als global oder Member.

    Erst das includen vom Header von Unit2 im Header von Form1 löst das Problem und macht die Forward Declaration überflüssig.
    Das liegt daran das vector eben Instanzen des Elementtypes kopieren und deren Größe kennen muß, und zwar bereits beim Deklarieren, nicht erst beim Benutzen.

    bis bald
    akari



  • @Braunstein:
    Ich habe das ganze jetzt mit forward-Deklarationen gemacht.Es wird fehlerfrei compiliert, aber der Debugger sagt mir, das die in der Struktur definierten Felder keine Elemente des vector sind.

    Gruß Udo



  • @akari
    Ich habe den gleichen Test gemacht und keine Probleme damit gehabt sofern in der cpp-Datei die Deklaration bekannt war (BCB5 und BCB2007).
    [edit]

    Das liegt daran das vector eben Instanzen des Elementtypes kopieren und deren Größe kennen muß

    Wenn der vector ein member der Klasse ist wird erst beim Aufruf des Konstruktors eine Instanz erzeugt und somit muß auch erst da der Objekttyp vollständig bekannt sein.
    [edit]

    @Udo_11
    Keine Ahnung woran das jetzt liegt. Es könnte sein, dass der Debugger die Deklaration nicht kennt.



  • Kommando zurück!!!
    Mein letzter Post war falsch. Auch mit Forward-Deklarationen gehts.
    in der MainForm.h:

    ...
    ...
      struct ndata
      {
        String profil;
        double tonnage;
        int anzahl;
      } ;
    
    //----------------------------------------------------------------------------
    class TMainForm : public TForm
    {
    ...
    ...
    

    In den MDI-Formularen(.cpp):

    ...
    ...
      struct ndata;
    
      std::vector<ndata> ch_data;
    
    //---------------------------------------------------------------------------
    __fastcall Twk_leben::Twk_leben(TComponent* Owner)
      : TForm(Owner)
    {
    ...
    ...
    

    Gruß Udo



  • Hallo

    Braunstein schrieb:

    @akari
    Ich habe den gleichen Test gemacht und keine Probleme damit gehabt sofern in der cpp-Datei die Deklaration bekannt war (BCB5 und BCB2007).

    Ah okay. Wenn ich die Deklaration als Member des Forms (und nicht global) verlagere und in der cpp den Include einfüge, dann kompiliert es wirklich.

    bis bald
    akari



  • @Akari und Braunstein

    Danke für Eure Hilfe!

    Habt Ihr Euch meine letzten Codeausschnitte mal angeschaut?
    Kann man das so stehen lassen?

    Gruß Udo



  • Hallo

    Ja das ist in Ordnung.

    bis bald
    akari


Anmelden zum Antworten