[gelöst] struct in einem vector speichern, möglich?



  • Huhu,

    ist es möglich ein struct

    struct auto{
        int baujahr;
        Halter h;
        vector<String> reperaturen;
    };
    

    in einem vector zu speichern, also

    vector<auto> autohaus;
    

    bzw. ich bekomme vom folgende fehlermeldung:

    template argument for ‘template<class _Alloc> class std::allocator’ uses local type
    

    Also meine Frage: Ist sowas möglich und ich habe nur irgendwas falsch gemacht?
    (ich möchte eigentlich nicht mein struct in eine Klasse umwandeln, nur wenn es nicht anders geht).



  • gib' deinem struct einen anderen Namen. auto ist reserviert.



  • du hast recht 😉

    das hier war nur ein Beispiel...

    also der eigentliche Fehler tritt bei z.b.

    struct meinAuto{
        // wie oben
    }
    

    auf!



  • Der Code ist korrekt. Hast du irgendwo ein std::allocator?



  • poste doch mal ein compilierbares mini-bsp.

    struct == class (mit extrem wenigen unterschieden, die hier nicht relevant sind)

    dein gezeigter quellcode sollte wie bereits erwähnt, korrekt sein...

    bb



  • struct == class (mit extrem wenigen unterschieden, die hier nicht relevant sind)

    Gibt es mehr als einen Unterschied? 😮 😮



  • okay, dann ist es wohl doch komplizierter :p

    Ich habe sowas:

    template <typename T> void function1(.....){
    
        struct Meinauto2{
            T wagen;
        };
    
        vector<MeinAuto> werkstadt;
    
    }
    

    Entschuldigt, ich dachte das vorherige Bsp reicht aus.



  • Alter kompletten Code!


  • Mod

    Die Fehlermeldung ist doch ziemlich eindeutig, anscheinend hast du dein struct innerhalb eines Anweisungsblocks lokal definiert. Mit solchen lokalen Typen kann man keine Templates instanzieren. Definier dein struct außerhalb der Funktion.

    edit: Jetzt hast du den Code gepostet, während ich noch schrieb. Und meine Vermutung hat sich bestätigt



  • probier mal typename T wagen;



  • hmm... das lässt sich aber aus vielen gründen nicht kompilieren, wenn du wirklich so was verzapft hast...

    template <typename T>
    struct meinwagen
    {
      T wagen;
    };
    
    void foo()
    {
      std::vector< meinwagen<int> > autos;
    }
    

    lässt sich compilieren, funktioniert wie gewünscht, aber ist design-technisch wohl etwas eigenartig^^

    bb


  • Mod

    'Tschuldigung für leicht Offtopic:

    typename schrieb:

    probier mal typename T wagen;

    Da steht doch schon im template, dass T ein typename ist. Das explizite typename braucht man um den Compiler zu sagen, dass sowas ein Typenname ist:

    struct foo{
     typedef int bar;
    }
    
    template<typename T> beispiel{
     T::bar falsch;             // Das geht nicht, weil der Compiler noch nicht weiß, was T ist
     typename T::bar richtig;   // Daher muss man sagen, das T::bar eine Typbezeichnung sein soll
    }
    


  • unskilled schrieb:

    hmm... das lässt sich aber aus vielen gründen nicht kompilieren, wenn du wirklich so was verzapft hast...

    template <typename T>
    struct meinwagen
    {
      T wagen;
    };
    
    void foo()
    {
      std::vector< meinwagen<int> > autos;
    }
    

    lässt sich compilieren, funktioniert wie gewünscht, aber ist design-technisch wohl etwas eigenartig^^

    bb

    Danke.
    eine äußere Definition funktioniert.
    Aber ich verstehe noch nicht ganz warum...? Kann mir jemand ein Bsp nennen bei der so eine lokale Definition zum Problem wird?

    Was genau findest du eigenartig? bzw was kann ich noch verbessern?



  • SeppJ schrieb:

    Die Fehlermeldung ist doch ziemlich eindeutig, anscheinend hast du dein struct innerhalb eines Anweisungsblocks lokal definiert. Mit solchen lokalen Typen kann man keine Templates instanzieren. Definier dein struct außerhalb der Funktion.

    edit: Jetzt hast du den Code gepostet, während ich noch schrieb. Und meine Vermutung hat sich bestätigt

    Das Problem wurde schon genannt.
    Simon



  • SeppJ hatte doch geschrieben, wieso das nciht geht!?

    Was genau findest du eigenartig? bzw was kann ich noch verbessern?

    meinwagen<int> wagen;
    wagen.wagen = 3;
    

    z.bsp. ;o)
    kann aber auch sein, dass du dein bsp nur so weit vereinfacht hast, dass es fragwürdig erscheint^^

    bb


  • Mod

    windschief schrieb:

    Danke.
    eine äußere Definition funktioniert.
    Aber ich verstehe noch nicht ganz warum...? Kann mir jemand ein Bsp nennen bei der so eine lokale Definition zum Problem wird?

    Was genau findest du eigenartig? bzw was kann ich noch verbessern?

    Der tiefere Sinn dahinter liegt darin, dass Typen als Templateparameter externe Bindung haben müssen. Ein kurzes, knackiges "Aha"-Beispiel, warum das so sein muss, fällt mir jedoch gerade nicht ein.

    Die äußere Definition deiner Klasse kann man auch nochmal in einem namespace verstecken.

    Falls du mal lokale Funktoren verwenden willst und das gleiche Problem wie hier bekommst, kannst du das durch eine äußere Wrapperklasse umgehen:
    http://groups.google.com/group/comp.lang.c++.moderated/msg/190eed7804da6a46

    Mit dem Thema verwandt ist auch die Frage, wie man Stringliterale als Templateargument benutzen kann. Dies ist nämlich aus den gleichen Gründen verboten. Das hatten wir auch kürzlich hier im Forum, inklusive möglicher Abhilfe:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-254003.html



  • unskilled schrieb:

    SeppJ hatte doch geschrieben, wieso das nciht geht!?

    theta schrieb:

    Das Problem wurde schon genannt.
    Simon

    wieso schon, aber ich wollte noch verstehen warum...

    Danke SeppJ.

    Also liegt das Problem nicht am dem Vector< struct >, sondern gleich am struct?

    Hmmm, aber warum funktioniert das:

    template <typename T> void function1(.....){
    
        struct Meinauto2{
            T wagen;
        };
    }
    

    also ohne

    vector<MeinAuto2> werkstadt;
    

    (sorry, ich will es nur wirklich verstehen)

    Das man die typename variable T nicht als Zeichenkette oder per Zuweisung übergeben kann leuchtet mir irgendwie ein.

    Aber hier habe ich doch eine Funktion die mit mit einer bestimmung von typename aufgerufen wird und im struct befinden sich ja auch nur diese Variablen...


  • Mod

    Nochmal:

    Das Problem ist: Du darfst keine Templates mit lokalen Klassen instanzieren.

    Lokale Klassen sind ok:

    void foo()
    {
     struct lokale_klasse{};
    }
    

    Templateinstanzierung ist ok:

    class externe_klasse{};
    
    void foo()
    {
     vector<externe_klasse> bar;
    }
    

    Templateinstanzierung mit lokalen Klassen ist nicht ok:

    void foo()
    {
     class lokale_klasse{};
     vector<lokale_klasse> bar; // Geht nicht!
    }
    

    Der Fakt, dass deine lokale Klasse zudem von einem Templateparameter der Funktion abhängt, hat überhaupt gar nichts mit dem Problem zu tun.



  • vielen vielen dank für die ausfürliche Erklärung!


Log in to reply