Forum: PC-Programmierung C++ Templates in Strukturen


von Thomas (Gast)


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?

von Bartli (Gast)


Lesenswert?

Bevor du selber weiterbastelst...was spricht gegen eine std::map / 
std::multimap?

von Uhu U. (uhu)


Lesenswert?

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

von Thomas (Gast)


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.

von Bartli (Gast)


Lesenswert?

Alles was du mit Klassen machen kannst, kannst du auch mit Strukturen 
machen. Lies mal 
http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=/com.ibm.xlcpp8l.doc/language/ref/cplr054.htm

Nimm trotzdem ne map.

von Rolf Magnus (Gast)


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.

von Thomas (Gast)


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...

von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

Im Anhang mal die Klasse unter Verwendung von std::vector.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.