Struct in Vector speichern



  • Hallo

    Ich versuche nun schon seit einer Weile, einen struct in einem Vector zu speichern:

    struct Proc {
        int arrival_time;
        int cpu_time;
        int waiting_time;
        int processing_time;
        Proc(int a, int c) : arrival_time(a), cpu_time(c) {}
    };
    vector< Proc > processes;
    

    Als Fehlermeldung erhalte ich andauernd:
    - error: template argument for 'template<class _Alloc> class std::allocator' uses local type 'main(int, char**)::Proc'
    - error: trying to instantiate 'template<class _Alloc> class std::allocator'
    - error: template argument 2 is invalid
    - error: invalid type in declaration before ';' token

    Aber wo liegt denn das Problem? 😕

    edit: Gerade habe ich den struct Teil aus der main() verschoben und nun scheint es zu funktionieren. An was liegt das?


  • Mod

    sili schrieb:

    Aber wo liegt denn das Problem?

    - error: template argument [...] uses local type ...



  • camper schrieb:

    sili schrieb:

    Aber wo liegt denn das Problem?

    - error: template argument [...] uses local type ...

    Sprich, ein struct sollte man immer ausserhalb der main() definieren?

    vector<Proc> processes;
    Proc* p = new Proc(arrival_time, cpu_time);
    processes.push_back(p);
    

    Dies führt nun aber zu folgender Fehlermeldung:
    - error: no matching function for call to 'std::vector<Proc, std::allocator<Proc> >::push_back(Proc*&)'

    Wie beheb ich das?



  • #include <vector>
    


  • drakon schrieb:

    #include <vector>
    

    Ganz so einfach ist es dann doch nicht 😉
    Das ist bereits im Code, funktionieren tut es trotzdem nicht.



  • sili schrieb:

    Sprich, ein struct sollte man immer ausserhalb der main() definieren?

    Das ist das übliche Vorgehen für Klassen. Spricht etwas dagegen?

    sili schrieb:

    Wie beheb ich das?

    Schau mal, was für einen Elementtyp dein std::vector hat und was du mit push_back() einfügen willst.



  • Nexus schrieb:

    Schau mal, was für einen Elementtyp dein std::vector hat und was du mit push_back() einfügen willst.

    Meinst du den Pointer (Proc*)? Ohne diesen (also nur mit "Proc p = new Proc(...);" erhalte ich die Meldung: conversion from 'Proc*' to non-scalar type 'Proc' requested

    😕



  • Hi,

    ich bin mir nicht sicher, aber wandle mal dein struct in class um und schau ob es dann funktioniert. Falls ja liegt es vermutlich am allocator.

    template < class T, class Allocator = allocator<T> > class vector
    

    http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4079/



  • anonymus_110 schrieb:

    ich bin mir nicht sicher, aber wandle mal dein struct in class um und schau ob es dann funktioniert. Falls ja liegt es vermutlich am allocator.

    Nein das hat damit nichts zu tun. struct und class unterscheiden sich einzig durch den default Zugriff (public für struct, private für class) und sind sonst absolut identisch.



  • vector<Proc> processes;
    processes.push_back( Proc(arrival_time, cpu_time) );
    


  • evilissimo schrieb:

    vector<Proc> processes;
    processes.push_back( Proc(arrival_time, cpu_time) );
    

    Danke, so funktioniert es tatsächlich 🙂
    Geht das nicht, dass man den Struct vorher einer Variable zuweist und gegebenenfalls noch weiterverarbeitet bevor man ihn in dem Vector speichert?



  • Hä? Doch klar geht das, zeig doch mal was du hast 🙂 .



  • sili schrieb:

    vector<Proc> processes;
    Proc* p = new Proc(arrival_time, cpu_time);
    processes.push_back(p);
    

    Dies führt nun aber zu folgender Fehlermeldung:
    - error: no matching function for call to 'std::vector<Proc, std::allocator<Proc> >::push_back(Proc*&)'

    So 😉



  • sili schrieb:

    vector<Proc> processes;
    Proc* p = new Proc(arrival_time, cpu_time);
    processes.push_back(p);
    

    p ist ein Zeiger, und "processes" enthält Objekte. Merkst du das was das Problem ist?

    Entweder verwendest du einen Vektor auf Zeiger oder Objekte (Im Falle von Zeigern, musst du diese natürlich später auch mit delete selbst freigeben).



  • asc schrieb:

    Entweder verwendest du einen Vektor auf Zeiger oder Objekte

    Warum? Geht doch:

    #include <iostream>
    #include <vector>
    
    struct Person
    {
    	Person(const std::string ctorName) :
    		name(ctorName) { }
    
    	std::string name;
    };
    
    int main()
    {
    	Person *person = new Person("Pedda");
    
    	std::vector<Person> personenVec;
    
    	personenVec.push_back(*person);
    
        delete person;
    
    	std::cin.get();
    }
    


  • Danke mit *p funktioniert es. Ich hätte schwören können, dass ich das bereits probiert habe... 😉



  • Kóyaánasqatsi schrieb:

    asc schrieb:

    Entweder verwendest du einen Vektor auf Zeiger oder Objekte

    Warum? Geht doch:

    Verwirr hier bitte niemanden. Das mischen geht weiterhin nicht (Ohne Dereferenzierung Zeiger einen Objekt, oder Objekt einem Zeiger zuweisen).



  • asc schrieb:

    und "processes" enthält Objekte.
    ...
    Entweder verwendest du einen Vektor auf Zeiger oder Objekte

    Ich will nur erwähnen, dass Du scheinbar unter "Objekt" etwas anderes verstehst als der C++ Standard. Es gibt auch Objekte von anderen (nicht-Klassen) Typen (int, void*, double, bool(*)(int), ...).

    Gruß,
    SP



  • Sebastian Pizer schrieb:

    Ich will nur erwähnen, dass Du scheinbar unter "Objekt" etwas anderes verstehst als der C++ Standard...

    Die Kritik nehme ich an, wenn auch nicht Kritiklos: Noch kein einziger in meiner gesamten Berufslaufbahn (überwiegend C++, bei mehr als 10 Jahre Berufserfahrung) hat den Begriff Objekt, in den Gebrauch des C++ Standards, sondern eher bezogen auf die Objektorientierte Programmierung (Instanz einer Klasse) verwendet. Es gibt bei mir eine Grenze bei der mir der Standard abgeht: Und zwar wenn der Sprachgebrauch im Programmierbereich in 90%+ der Fälle etwas anderes besagt. Vielleicht liegt es auch daran das ich nicht im Lehrbereich tätig bin...



  • asc, das hast du auch gesagt, als ich dich auf die Terminologie von "konstanten Referenzen" hingewiesen habe. Hier im Forum nehmen wir es halt gerne etwas genau... 😉


Anmelden zum Antworten