C++ Templates in Strukturen

Gast #645044
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
> 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
Lesenswert?
• ▲
▼
> 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
Lesenswert?
• ▲
▼
> 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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren