Templates und Klassen
-
Halte dich einfach an die üblichen Bezeichnungen, dann wirst du auch verstanden. Mit "parametrisierte Typen" verwirrst du erstmal jeden...
-
Nexus schrieb:
Halte dich einfach an die üblichen Bezeichnungen, dann wirst du auch verstanden. Mit "parametrisierte Typen" verwirrst du erstmal jeden...
Ich fand nur die Bezeichnung schön, ich würde doch niemals parametrisierte Typen statt Klassentemplate sagen!

(Mit schön meinte ich, nicht gut verständlich und jedem bekannt o.ä., sondern trefflich beschreibend)Gerri84 schrieb:
ok thx damit sind alle unklarheiten beseitigt

Ignorier' einfach die letzten Posts, mein Fehler. (Sonst kommen wieder Unklarheiten auf)
Omen2 schrieb:
Gerri84 schrieb:
ahh okey ich seh ein licht am ende des tunnels... noch eine frage hat die endung irgend einen einfluss .impl oder könnte das jede endung haben ?
Sollte *.impl sein. Es gibt auch noch andere Dateiendungen die das Gleiche bewerkstelligen, aber diese kannst Du auch gut selber googeln

GCC nutzt .tcc - was heißt das überhaupt? template....?
-
Die partielle Spezialisierung eines Klassentemplates ist ein Template in der die Parameterliste des Primärtemplates durch eine andere ersetzt wird. Es gibt ein paar Beschränkungen, die neue Argumentliste muss aber nicht kürzer sein.
template <typename T, typename U> struct foo; // Primärtemplate template <typename T, typename U> struct foo<T,U>; // ill-formed, Argumentliste ist identisch zur (impliziten) Liste des Primärtemplates template <typename T, typename U> struct foo<U,T>; // ok, aber wahrscheinlich sinnlos template <typename T, typename U, typename V> struct foo<T(U), V>; // Parameterliste ist längerEine explizite Spezialisierung eines (Klassen-, Funktions-, Alias-) Templates ist eine Klasse/Funktion/Typ, in dem die formalen Argumente des Templates mit konkreten Argumenten ersetzt wurden.
In der Deklaration eines Primärtemplates folgt dem Namen des Templates keine Argumentliste.
In der Deklaration eine Spezialisierung eines Templates folgt dem Namen des Templates eine Argumentliste.
Ist in der Deklaration die Parameterliste einer Spezialisierung leer, handelt es sich um eine explizite (vollständige) Spezialisierung.Abgesehen von den obigen Umständen, verweist ein Templatename, dem eine Argumentliste folgt, stets auf eine explizite Spezialisierung (also Klasse/Funktion/Typ).
Wird ein Templatename nicht von einer solchen Liste gefolgt, so verweist er in der Regel auf das Template, aber u.U. auch ggf. auf eine explizite Spezialisierung (der Name eines Klassentemplates innerhalb seiner Definition ggf. auf die gegenwärtige Instanz, bzw. bei einem Funktionstemplate, wenn die Templateargumente deduziert werden können), wenn der Kontext das verlangt.Die Instantiierung eines (expliziten) Templatespezialisierung ist äquivalent zur Verarbeitung der Definition einer normalen Klasse/Funktion (eine formale Definition wird nicht gegeben), aus einer gegeben Templatedefinition heraus. Eine solche Instantiierung kann implizit oder explizit erfolgen.
Wurde eine explizite Templatespezialisierung deklariert, so erfolgt keine Instantiierung dieser Spezialisierung (bzw. das Programm ist ggf. ill-formed, falls die Instantiierung bereits vor der Deklaration/in einer anderen ÜE erfolgte); bei Verwendung dieser Spezialisierung muss sie auch separat (vom Template) definiert werden.Verwirrung stiftet wahrscheinlich die Tatsache, dass das Wort Spezialisierung allein mehrdeutig sein könnte: ist die jeweilige Entität (Klasse/Funktion/Typ) gemeint, oder aber die Deklaration derselben. Im Standard ist immer Ersteres gemeint. Aus diesem Grund taucht specialize auch nicht als Verb auf (außer in zwei Beispielen, deren Text sicher irgendwann mal überarbeitet wird).
-
danka danke für so viel input
und trotzdem bleiben fragen kann ich ein template auch für liste/vector verwenden ?
-
Gerri84 schrieb:
danka danke für so viel input
und trotzdem bleiben fragen kann ich ein template auch für liste/vector verwenden ?Frage bitte präzisieren.
-
habe eien klasse die sonst keine templates enthält nur einen member welcher als liste oder vector verwendet werden soll muss dazu die klasse als template angelegt werden ? und wenn dieser member privat ist wie muss die get methode aussehen um darauf zuzugreifen ?
-
das kommt drauf an, ob du den Typen des vectors fest vorgeben willst, oder nicht:
class Tst { std::vector<int> bla; std::list<int> blubb; }; template <class T> class Tst { std::vector<T> bla; std::list<T> blubb; };
-
Gerri84 schrieb:
als liste oder vector
Listen willst du eigentlich nie. Listen sind oberlahm verglichen mit anderen Container.
Verwende std::vector wenn möglich, std::deque (std::stack/std::queue) oder std::map/std::set bei Spezialwünschen. Wenn du meinst, eine std::list zu brauchen, frag nochmal hier im Forum nach.
-
ok also um funktionen oder methoden für vector und liste zu verwenden bleibt eigentlich dann nur der weg über iteratoren oder ?
-
Gerri84 schrieb:
ok also um funktionen oder methoden für vector und liste zu verwenden bleibt eigentlich dann nur der weg über iteratoren oder ?
nein. für std::vector gibt es immer noch den operator[] und at(). size() benötigt auch keinen Iterator.