stl queue kapseln
-
Hi,
ich möchte zur Übung die Klasse queue aus der stl kapseln.
Meine klasse queue_s soll also genau das selbe machen wie die Klasse queue.Mein Code sieht bisher so aus:
#include <queue> template <typename T> class queue_s { public: queue_s(T t):t1(t){} bool empty() { return t1_.empty(); } unsigned int size() { return t1.size(); } T front() { return t1.front(); } T back() { return t1.back(); } void push(T t) { t1.push(t); } void pop() { t1.pop(); } private: queue<T> t1; };Leider gibt es einige Fehler, die sich alle auf die private Membervariable beziehen:
error C2143: Syntaxfehler: Es fehlt ';' vor '<'
error C4430: Fehlender Typspezifizierer - int wird angenommen.
error C2238: Unerwartete(s) Token vor ';'Was muß ich ändern damit es funktioniert?
-
std::queue<T> t1;
-
Du arbeitest hier öfters mit Kopien statt, wie das Original, mit Referenzen.
-
Schau dir nochmal Zeile 10 an.
-
Hi, dank eurer Hilfe habe ich schon eine lauffähige Version hinbekommen:
#include <queue> template <class T> class queue_s { public: queue_s(T t):t1(t){} queue_s(){} bool empty() { return t1.empty(); } unsigned int size() { return t1.size(); } T front() { return t1.front(); } T back() { return t1.back(); } void push(T t) { t1.push(t); } void pop() { t1.pop(); } private: std::queue<T> t1; };Danke für den Hinweis zu meinem Flüchtigkeitsfehler in Zeile 10
Wenn ich nun versuche den Hinweis von Ethon umzusetzen:
void push(T &t) { t1.push(t); }bekomme ich bei der Verwendung meiner Klasse
queue_s<int> q; q.push(7);error C2664: 'queue_s<T>::push': Konvertierung des Parameters 1 von 'int' in 'int &' nicht möglich
Wie kann ich bei der Verwendung von Templates Referenzen verwenden
-
Referenzen auf Literale müssen const sein. Damit mein ich nicht die Referenz ansich (ist ohnehin immer const) sondern das referenzierte Objekt.
void push(const T &t) { t1.push(t); }@Ethon: erster

-
Das machst du mit einer konstanten Referenz

Ansonsten könntest du ja den Wert 7 ändern, der ja nicht direkt als Wert existiert. Kein Wunder dass der Compiler das verbietet.void push(T const& t) { t1.push(t); }
-
die getter kannst du auch const machen.
bool empty() const { return t1.empty(); } unsigned int size() const { return t1.size(); }
-
Hi,
für die get-Methoden habe ich zwei verschiedene Möglichkeiten gefunden die sich aber gegenseitig auszuschließen scheinen:
Als referenz Rückgabe:
T &front() { return t1.front(); }als Const
T front() const { return t1.front(); }Kombiniere ich beides
T &front() const { return t1.front(); }bekomme ich den Fehler:
Error C2440: 'return': 'const int' kann nicht in 'int &' konvertiert werden
Durch die Konvertierung gehen Qualifizierer verloren.Welche Art ist nun die Beste?
-
Beides:
T& front() { return t1.front(); } const T& front() const { return t1.front(); }Dann wird die richtige Funktion gewählt, je nachdem ob das Objekt const ist oder nicht.