Vector<T> in header?



  • Hallo,
    gibt es einen Weg in einer Header Datei einen Vector zu definieren, ohne dass deren generischer Typ zu der Zeit bekannt ist? Beispiel:

    //include...
    class Foo{
    
      vector<T> test;
    };
    

    So dass ich erst wenn ich irgendwann test initialisie den Typ von T bestimme? Oder geht dies nur, in dem ich alles von vector in eine template<class T> klebe und quasi alle Methode von vector in einer Pseudoklasse wrappe?
    Im obrigen beispiel soll Foo selbst kein template sein, es ist eine Klasse die standard-operationen wahrnimmt, nur arbeitet diese halt auf einem vector<T> bei der sich T mit jeder neu initialiserung ändern könnte, also mal string, mal int, mal sonst was



  • vll. so:

    template<class T>
    class Foo{ 
    
      vector<T> test; 
    };
    

    nachher im programm

    Foo<TYP> o:
    
    o.test.pushback(TYP(..));
    

    hab dass noch nie gemacht, kann auch sein das es nich klappt



  • Da wird dir kaum etwas anderes übrig bleiben, als die Klasse als Template zu deklarieren.. Ich weiß auch nicht, wie du dir das vorstellst, dass T mal so mal so ist 😉 Und was meinst du mit "jeder Initialisierung"? Meinst du damit, bei jeder Instanz-Deklaration? Dann ist ein template doch perfekt..? Oder was spricht dagegen?



  • Nein, das geht nicht - bei einem Template muß bereits zu Compilezeit feststehen, wie die verwendeten Template-Parameter belegt werden.

    (Randfrage: Was soll überhaupt der Sinn hinter dem Ganzen sein?)



  • In dem Fall duerfte Foo dann doch besser ein Kassentemplate sein. Denn irgendwo wirst du ja auch mit den Daten aus dem vector arbeiten muessen (es sei denn du willst ihn nur resizen etc.) und daher auch in den Methoden von Foo mit den T's arbeiten. Also =>

    template <class T>
    class Foo {
    /* ... */
    
    private:
      vector<T> test;
    /* ... */
    
    };
    

    Und - nein, du kannst keinen generischen Typ in einem nicht-Template benutzen



  • Der Sinn ist, dass ich einen Rückgabe Typ brauche, dies wäre dann meine Klasse, die besteht aus mehreren einzelnen Typen, wie String, Int usw + einen Typen vector<T>, abhängig davon an wen ich diesen Rückgabetypen sende soll der vector<T> anders behandelt werden.

    Also wenn Methode A den Rückgabetypen übergeben bekommt, so ist für Methode A klar, dass dies ein vector<int> ist, sonst hätte diese Methode den Rückgabetypen nicht bekommen, Methode B erwartet jedoch den Rückgabetypen so, dass vector<string> ist. Dabei ist halt nur der eine vector generisch, heißt dass, wenn ein Teil generisch ist, muss die Klasse auch generisch sein?

    Edit: Habs verstanden, anscheinend meinte ich den Code von pumuckl, nun ist es klarer.

    Danke



  • template<typename T>
    vector<T> meineMethode(T);
    

    ?


Anmelden zum Antworten