Syntaxproblem bei Doppelter Classverschachtelung
-
Also, wenn du Templates benutzen willst, muss alles in Einem sein. Sprich die Deklaration darf nicht getrennt werden, ansonsten erhälst du entsprechende Fehler. Also alles gemeinsam implementieren.
Gruß Gate
-
Gate schrieb:
Also, wenn du Templates benutzen willst, muss alles in Einem sein. Sprich die Deklaration darf nicht getrennt werden, ansonsten erhälst du entsprechende Fehler. Also alles gemeinsam implementieren.
Gruß Gate
Alles gemeinsam? Ich habe doch wie gesagt alles in einer Header Datei, jede Deklaration und Defintion steht da drinne, nur bei der jetzt gibts Probleme.
-
Firefighter schrieb:
Gate schrieb:
Also, wenn du Templates benutzen willst, muss alles in Einem sein. Sprich die Deklaration darf nicht getrennt werden, ansonsten erhälst du entsprechende Fehler. Also alles gemeinsam implementieren.
Gruß Gate
Alles gemeinsam? Ich habe doch wie gesagt alles in einer Header Datei, jede Deklaration und Defintion steht da drinne, nur bei der jetzt gibts Probleme.
Na, so wie es in deinem Code aussieht, ist in der Klasse nur die Deklaration und weiter unten ausserhalb der Klasse die Definition. So weit ich weiß, muss diese Definition mit in die Klassendeklaration. Wie gesagt, sofern ich das jetzt richtig Überblicke.
-
Gate schrieb:
Firefighter schrieb:
Gate schrieb:
Also, wenn du Templates benutzen willst, muss alles in Einem sein. Sprich die Deklaration darf nicht getrennt werden, ansonsten erhälst du entsprechende Fehler. Also alles gemeinsam implementieren.
Gruß Gate
Alles gemeinsam? Ich habe doch wie gesagt alles in einer Header Datei, jede Deklaration und Defintion steht da drinne, nur bei der jetzt gibts Probleme.
Na, so wie es in deinem Code aussieht, ist in der Klasse nur die Deklaration und weiter unten ausserhalb der Klasse die Definition. So weit ich weiß, muss diese Definition mit in die Klassendeklaration. Wie gesagt, sofern ich das jetzt richtig Überblicke.
Nein, eher nicht, soweit ich weiß und es auch schon öfter gesehen habe, kann man Deklaration von Definition bei Templates trennen solange Die Definition in irgend einer Art und Weiße mit in der selben Datei liegt wie die Deklaration
-
Firefighter schrieb:
Nein, eher nicht, soweit ich weiß und es auch schon öfter gesehen habe, kann man Deklaration von Definition bei Templates trennen solange Die Definition in irgend einer Art und Weiße mit in der selben Datei liegt wie die Deklaration
Okay, hab nochmal nachgeguckt und du hast recht, es reicht wenn es in der selben Datei ist. Was ist denn die genaue Meldung des Compilers?
-
Ah verdammt, man kann als nicht registrierte nicht editieren, sorry also für den Doppelpost. ALso wenn dein Code so vollständig ist, wie du ihn gepostest hast, dann fehlt doch einfach nur die Implementierung der genannten Methoden. Oder ist es genau Das, was du gerade versuchst und den Compilerfehler bekommst?
-
Also im moment sieht die Definition so aus
template<class T> List<T>::List_Iterator List<T>::begin()const { //Code }Die frage ist ob es so richtig ist? Auf jedenfall gibt er mir folgenden Fehler aus:
150|error: expected constructor, destructor, or type conversion before "List"
-
Firefighter schrieb:
Also im moment sieht die Definition so aus
template<class T> List<T>::List_Iterator List<T>::begin()const { //Code }Die frage ist ob es so richtig ist? Auf jedenfall gibt er mir folgenden Fehler aus:
150|error: expected constructor, destructor, or type conversion before "List"
Hmm, du könntest es mal so versuchen:
template<class T> List_Iterator List<T>::begin()const { //Code }Könnte klappen, da du dich ja bereits im scope der Klasse befindest, daher ist der Qualifizierer davor nicht nötig. Aber eigentlich wäre sowas kein Grund für einen Fehler, aber probieren kannst du es ja mal.
-
Ja das hatte ich ebend auch gedacht, und probiert hab ich es auch. Leider kommt der selbe Fehler.
-
Firefighter schrieb:
Ja das hatte ich ebend auch gedacht, und probiert hab ich es auch. Leider kommt der selbe Fehler.
Aber den Konstruktor von List_Iterator hast du doch auch implementiert und nicht nur deklariert oder?
-
Der ist definiert, aber der ist wieder innerhalb der Klasse definiert, weil es ja ebend nicht ging :(Meist du daran könnte es liegen?
-
So, habs jetzt einfach mal selbst ausprobiert und so läuft das bei mir wunderbar durch:
template<class T> class List { class List_Iterator { List_Iterator() { } }; List_Iterator begin()const { return List_Iterator(); } };Ich sehe auch keinen Grund warum du die Definition außerhalb der Klasse machen musst, daher würd ichs einfach so machen.
-
Naklar, da hast du Recht.Aber ich und viele andere machen es auch gerne das sie Deklaration von Implementation trennen. Weil es ich bin der Meinung das es auch auf meine Art irgendwie gehen muss.
-
Firefighter schrieb:
Naklar, da hast du Recht.Aber ich und viele andere machen es auch gerne das sie Deklaration von Implementation trennen. Weil es ich bin der Meinung das es auch auf meine Art irgendwie gehen muss.
Naklar, das ist soweit ja auch richtig und gut, nur gerade bei solchen Template Konstrukten würde ich, wenn es denn dann mal geht, davon abraten. Ich mein, guck dir mal die Boost Sachen, dort haben sie auch bei den meisten Dingen ihre Deklaration und Implementation zusammen gelassen, was natürlich auch daran liegt, dass Boost möglichst Header-only sein soll. Also, ich würd sagen, gerade da du bei Templates eh nur in einer Datei bleiben kannst, bringt die Trennung von Deklaration und Implementation nicht viel. Aber vllt. findest du ja noch ne Möglichkeit, wie du es noch anders hinbekommst.
-
Schreib mal ein
typenamevorList<T>::List_Iterator.Die Trennung kannst du auch gut bei Templates aufrechterhalten, beispielsweise indem du Deklaration und Implementierung in zwei Headerdateien auftrennst und die Deklarationsdatei am Ende ein Include hat.
-
Nexus, das typename hats gebracht. Kannst du kurz erklären warum das die Lösung war? Also was genau beim Compiler im Kopf jetzt vorgeht?
-
Bei Typen, die von Templateparametern abhängig sind, weiss der Compiler nicht, dass es sich um einen Typ handelt. Es könnte ja auch ein Member sein. Mit
typenamemachst du ihm klar, dass es ein Typ ist.
-
Alles klar, ich danke dir, ich wusste doch das es geht.
-
Mal noch ne andere Frage, wie kann ich mir merken, wann ich typename nutzen muss. Also gibt es dafür eine Konvention wann und wo das anwenden muss?
-
Schau dir mal 14.6 im Standard an. Da steht es genau, wann du es angeben musst.
Ansonsten gibst du es grundsätzlich an, um dem Compiler zu sagen, dass eine qualifizierung ein Typ ist und nichts anderes.