www.mikrocontroller.net

Forum: PC-Programmierung C++ Templates in Strukturen


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
template <class T>  
class varCont
{
  private:
    struct DATA_T
    {
      T var;            // Variable
      string varName;  // Variablenname  
    };
    vector<DATA_T> data;
Jetzt brauche ich in einer meiner Methoden aber einen Iterator für 
diesen Vektor:
template <class T>
T varCont<T>::getValue(const string &name)
{
  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?

Autor: Bartli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bevor du selber weiterbastelst...was spricht gegen eine std::map / 
std::multimap?

Autor: Uhu Uhuhu (uhu)
Datum:

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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bartli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles was du mit Klassen machen kannst, kannst du auch mit Strukturen 
machen. Lies mal 
http://publib.boulder.ibm.com/infocenter/lnxpcomp/...

Nimm trotzdem ne map.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Thomas (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Im Anhang mal die Klasse unter Verwendung von std::vector.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.