PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++]: templates und structs


pajofego
2008-03-03, 23:26:27
Guten Abend zusammen,

ich benötige mal wieder eine kleine Nachhilfe in Sachen templates und C++. Ich war gerade dabei folgenden Konstruktion zu bauen:

Hilfstemplate zum definieren eines Datentyps:


template<typename T> struct t_struct_1
{
typedef T t_struct_1_Value;
};


Jetzt wollte ich einen zweiten Struct, der wie folgt ausschauen sollte, aufbauen:


template<typename T> struct t_struct_2
{
t_struct_1<T>::t_struct_1_Value *i; // Fehlermeldung vom Compiler
t_struct_1<double>::t_struct_1_Value *i; // geht ohne Probleme
};


Jetzt mal wieder die quälende Frage von meiner Seite. Was mache ich bei der Verwendung von t_struct_1<T>::t_struct_1_Value *i falsch, s.d. der Compiler dies nicht übernehmen möchte? Mit der Fehlermeldung: expected `;' before '*' token kann ich nicht wirklich viel anfangen.

Danke im voraus und viele Grüße
pajofego

Coda
2008-03-03, 23:45:34
Öh t_struct_1<T>::t_struct_1_Value hat doch den Typ T, wofür das ganze dann?

pajofego
2008-03-04, 00:01:38
Hi Coda,

ich komm grad net mit.

Ich möchte t_struct_1 in t_struct_2 verwenden. Wie du schon sagtest, ist t_struct_1<T>::t_struct_1_Value von Datentyp T. Wie hätte denn die Verwendung von Datenfelder vom Typ T von t_struct_1 in t_struct_2 aussehen müssen?

Danke,
Gruß
pajofego

Coda
2008-03-04, 00:11:16
Du musst "typename t_struct_1<T>::t_struct_1_Value *i;" schreiben, aber ich verstehe den Sinn immer noch nicht, weil das das gleiche wie "T *i;" sein sollte.

pajofego
2008-03-04, 00:25:17
Du musst "typename t_struct_1<T>::t_struct_1_Value *i;" schreiben, aber ich verstehe den Sinn immer noch nicht, weil das das gleiche wie "T *i;" sein sollte.

Hi Coda,

zunächst erstmal danke. Funktioniert!

Ich gebe dir recht! Habe nicht daran gedacht, ist wohl ein typischer Anfängerfehler. Habe einfach nach Vorlage gearbeitet!

Wieso muss man eigentlich "nochmal" ein typename setzen? Ich dachte im template Definitionskopf würde schon explizt durch die Anweisung in <typename T> stehen, dass hier ein Platzhalter für den Datentyp T steht?!

Danke Gruß
pajofego

Coda
2008-03-04, 00:32:12
"The typename keyword is required if a dependent name is to be treated as a type. "

pajofego
2008-03-04, 22:45:17
"The typename keyword is required if a dependent name is to be treated as a type. "

Hi Coda,

offenbar wirft der VC++ Compiler eine Compilermeldung mit der man offensichtlich weitergekommen wäre. Der gcc hingegen lediglich: "expected `;' before '*' token" . Damit konnte beim besten Willen nicht erkennen was die Ursache ist. Also, danke für die Diskussion und die Tipps.

Gruß
pajofego