C++ Templates in Strukturen

Gast #645044
Hi,
ich möchte mir eine Container-Klasse schreiben die andere Objekte über 
einen Namen verwaltet.
Diese soll über Templates generell gehalten werden.
In meiner Klassendefinition habe ich folgendes:
1
template <class T>  
2
class varCont
3
{
4
  private:
5
    struct DATA_T
6
    {
7
      T var;            // Variable
8
      string varName;  // Variablenname  
9
    };
10
    vector<DATA_T> data;
Jetzt brauche ich in einer meiner Methoden aber einen Iterator für 
diesen Vektor:
1
template <class T>
2
T varCont<T>::getValue(const string &name)
3
{
4
  vector<DATA_T>::iterator iter;
Dort bekomme ich dann aber beim Übersetzen eine Fehlermeldung "expected 
`;' before "iter""

Ich vermute, dass dem Compiler der Datentyp nicht bekannt ist. Aber alle 
Versuche meine Struktur z.B. als typedef zu deklarieren scheitern.

Kann mir jemand weiterhelfen?
Gast #645487
> Bevor du selber weiterbastelst...was spricht gegen eine std::map /
> std::multimap?

Dass ich damit noch nicht gearbeitet habe ;-)
Aber nach dem was ich gerade so gelesen habe, scheint das ja auch das zu 
sein was ich bräuchte.
Die Suche nach der entsprechenden Variable würde ich in meinem Vektor 
auch per binärer Suche machen (also diesen nach jedem neuen Eintrag 
sortieren lassen).

> Kann es sein, daß bei class varCont }; fehlt? Diese komische
> Fehlermeldung könnte dazu passen...

Nein, fehlt nicht.
Wenn ich anstatt vector<DATA_T>::iterator z.B. vector<int> schreibe 
übersetzt er auch.

Aber ich habe eben noch gesehen, dass es mit der Struktur sowieso nicht 
funktioniert, da die sort-Funktion ja nicht weiß wonach sie sortieren 
soll. Irgendwie muss ich die Sachen noch in eine eigene Klasse schreiben 
damit ich die Operatoren =,< und == beschreiben kann.
Gast #645619
> Die Suche nach der entsprechenden Variable würde ich in meinem Vektor
> auch per binärer Suche machen (also diesen nach jedem neuen Eintrag
> sortieren lassen).

Ein Vektor ist dafür aber eher ungeeignet. Und bei jedem Einfügen den 
kompletten Container neu zu sortieren ist auch übertrieben.

> Kann es sein, daß bei class varCont }; fehlt? Diese komische
> Fehlermeldung könnte dazu passen...

> Wenn ich anstatt vector<DATA_T>::iterator z.B. vector<int> schreibe
> übersetzt er auch.

Das kommt daher, daß iterator hier ein "dependant name" ist. Probier's 
mal mit typename vector<DATA_T>::iterator.

> Aber ich habe eben noch gesehen, dass es mit der Struktur sowieso nicht
> funktioniert, da die sort-Funktion ja nicht weiß wonach sie sortieren
> soll.

Und?

> Irgendwie muss ich die Sachen noch in eine eigene Klasse schreiben
> damit ich die Operatoren =,< und == beschreiben kann.

Struct und Klasse sind in C++ mehr oder weniger dasselbe. Alles, was mit 
dem einen geht, geht auch mit dem anderen. Außerdem kann man bei sort() 
die Vergleichsfunktion auch über einen weiteren Parameter angeben.
Ich würde aber auch vorschlagen, einfach std::map zu verwenden.
Gast #646969
> Das kommt daher, daß iterator hier ein "dependant name" ist. Probier's
> mal mit typename vector<DATA_T>::iterator.

Mit 'typename' funktioniert es, danke.
Ich werd mal beide Versionen mit vector und map ausprobieren.

Aber Templates sind ja schon etwas kryptisch...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.