Problem mit einach verketteter Liste..
-
Hallo, habe schon ein paar Anlaufversuche hinter mir aber verstehe nicht wo hier ein Fehler sein soll :
(Ich deklariere hier nur eine einfach Liste, in die ich des Weiteren gedenke auch Daten einzufügen oder zu löschen. Wenn es aber hier schon Fehler gibt-die dazu für mich überhaupt nicht einzusehen sind, stell ich das erstmal in Frage
)
Fehler :
list.cpp:10:19: error: expected ')' before 'd'
list.cpp:15:8: error: ISO C++ forbids declaration of 'T' with no type [-fpermiss
ive]
list.cpp:15:8: error: expected ';' at end of member declaration
list.cpp:15:22: error: ISO C++ forbids declaration of 'getData' with no type [-f
permissive]
list.cpp:20:6: error: 'T' does not name a type
list.cpp: In member function 'int ListElem::getData()':
list.cpp:15:34: error: 'data' was not declared in this scope
list.cpp: In member function 'ListElem* ListElem::getNext()':
list.cpp:17:43: error: expected ';' before '}' token
list.cpp: At global scope:
list.cpp:30:1: error: expected declaration before '}' tokenDas sind einige ich weiß, aber als Anfänger irritiert mich das doch, da ich selbst nicht wüsste was zu verbessern sei..
(ich weiß std brauche ich hier nicht.. )#include <iostream> #include <string> using namespace std; class ListElem { public: ListElem(T* d) { next = NULL; data = d; } T* getData(void) {return data;} void setNext (ListElem *n) {next = n;} ListElem* getNext(void) {return next} private: T* data; ListElem* next; }; } int main () { int T; }
-
Es gibt keinen Typ der T heißt. (Und *T gibt es schon mal gar nicht, wenn T bekannt wäre, wäre T* ein Pointer auf T.)
Du möchtest wohl lernen, was Templates sind.
-
Was soll denn das *T jeweils sein? Das muesste dann schon T* heissen. Ausserdem existiert der Typ T gar nicht.
-
cooky451 schrieb:
Es gibt keinen Typ der T heißt. (Und *T gibt es schon mal gar nicht, wenn T bekannt wäre, wäre T* ein Pointer auf T.)
Du möchtest wohl lernen, was Templates sind.Ja, wahrscheinlich hat er Beispiele mit template<class T> (was eigentlich eher template<typename type> heißen sollte) gesehen und das template<class T> vergessen.
-
Ok, das sehe ich ein
Ich lerne mit den Folien meiner Uni und da steht das als Beispiel so..
Bin davon ausgegangen, dass das nicht so wild ist mit dem T* (nach dem Motto wird seinen Sinn haben - der sich mir im nächsten Schritt erschließt) ..
Leider wird in allen Beispielen in diesem Stil programmiert (zBListElem* List::find(T* d)
) . Von der Logik fand ich das auch alles gut zu merken, mehr oder weniger, aber ich wollte das doch gerne mal sehen was da so passiert.
In der Form leider nichts..
Kann man das vielleicht leicht modifizieren, dass es läuft ?
Soll ja wirklich erstmal nicht mehr können als keine Fehler auszugeben...
-
Das mit *T war ein Dreher und nicht gewollt .:)
-
Das muesste dann wohl etwa so aussehen:
template<typename T> class ListElem { public: ListElem(T* d) { next = NULL; data = d; } T* getData() { return data; } void setNext (ListElem *n) { next = n; } ListElem* getNext() { return next; } private: T* data; ListElem* next; };
Ich habs weder getestet noch kompiliert. Aber ich glaube es muesste so stimmen
-
Vielen Dank für die Zeit
Die Ausgabe ist schon deutlich besser :
D:\__UNI\..\test>g++ list.cpp
list.cpp: In constructor 'ListElem<T>::ListElem(T*)':
list.cpp:5:16: error: 'NULL' was not declared in this scopeVon Template stand da nix aber freu mich schonmal, dass es nicht nur am restlichen Code lag..
Dass man NULL deklarieren soll ist mir nun aber wirklich neu, manche Fehler muss man erst noch verstehen lernen...
-
Das ist merkwuerdig. Was fuer einen Compiler nutzt du? NULL muesste eigentlich vom Preprocessor bereits verarbeitet werden. Alternativ geht auch
next = 0;
-
icarus2 schrieb:
Das ist merkwuerdig. Was fuer einen Compiler nutzt du? NULL muesste eigentlich vom Preprocessor bereits verarbeitet werden.
Dafür braucht man aber cstddef.
-
0 habe ich auch ausprobiert aber funktioniert auch nicht.
Nutze minGw (ich verzweifel da manchmal drann wenn es bessere gibt freue ich mich über jeden Tipp) - Wollte es jetzt vermeiden Studio zu nehmen, weil das mir so viele Daten in die Projektordner donnert, die ich weder verstehe noch nutzen kann.
Außerdem war ich der Meinung auf dem Holzweg anzufangen..
Auto fahren sollte man auch nicht gleich im Porsche lernenD:\__UNI\..\test>g++ list.cpp
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../libmingw32.a(main.o): In fu
main': C:\\MinGW\\msys\\1.0\\src\\mingwrt/../mingw/main.c:73: undefined reference to
n@16'
collect2: ld returned 1 exit statusUnverständlich einfach...
-
SeppJ schrieb:
icarus2 schrieb:
Das ist merkwuerdig. Was fuer einen Compiler nutzt du? NULL muesste eigentlich vom Preprocessor bereits verarbeitet werden.
Dafür braucht man aber cstddef.
Habe ich eben versucht aber ich glaube diese Datei nicht zu besitzen :
D:\__UNI\..\test>g++ list.cpp
In file included from list.cpp:2:0:
c:\mingw\bin\../lib/gcc/mingw32/4.6.1/include/stddef.h:150:1: error: template de
claration of 'typedef'
list.cpp:5:15: error: expected ')' before '*' token
list.cpp:10:5: error: 'T' does not name a type
list.cpp:15:5: error: 'T' does not name a type
-
Zeig mal deinen Code. Mit Templates produzieren Anfänger häufig unerwartete Linkerfehler, wenn sie herumspielen. Da hilft dir auch ein Compilerwechsel von normalem Auto auf Bundesautobahn hin zu Auto mit Zündschloss links und Kofferraum vorne auf Mautstraße nicht.
P.S.: Meine Fahrschule hatte einen Porsche.
-
@SeppJ:
Das wusste ich nicht. Wird der in MS VS automatisch eingebunden? Hat bei mir immer gelappt ohne explizites einbinden.@ffm439:
Warum heisst dein File main.c? Das waere dann wohl C und nicht C++.
Poste doch mal deinen aktuellen Code.
-
Ja.. ok
Bin jetzt hier :template<typename T> #include <stddef.h> class ListElem { public: ListElem(T* d) { next = 0; data = d; } T* getData() { return data; } void setNext (ListElem *n) { next = n; } ListElem* getNext() { return next; } private: T* data; ListElem* next; };
-
ffm439 schrieb:
SeppJ schrieb:
icarus2 schrieb:
Das ist merkwuerdig. Was fuer einen Compiler nutzt du? NULL muesste eigentlich vom Preprocessor bereits verarbeitet werden.
Dafür braucht man aber cstddef.
Habe ich eben versucht aber ich glaube diese Datei nicht zu besitzen :
D:\__UNI\..\test>g++ list.cpp
In file included from list.cpp:2:0:
c:\mingw\bin\../lib/gcc/mingw32/4.6.1/include/stddef.h:150:1: error: template de
claration of 'typedef'
list.cpp:5:15: error: expected ')' before '*' token
list.cpp:10:5: error: 'T' does not name a type
list.cpp:15:5: error: 'T' does not name a typeWTF? Du solltest ganz dringend mal deinen Code zeigen. Mir schwant übles. Hast du das Include zufällig in der Klasse stehen?
edit: Ja hast du. Was soll der Unsinn denn? Wenn du nicht weißt, was template ist und tut, dann informier dich doch erst einmal.
-
So bindet man ein hab ich gelernt
(shit...^^)
Ich hab es ja nur auf den Hinweis, es würde fehlen dahin geschrieben, ab Werk hatte ich das nicht.
-
icarus2 schrieb:
@SeppJ:
Das wusste ich nicht. Wird der in MS VS automatisch eingebunden? Hat bei mir immer gelappt ohne explizites einbinden.Das wird vermutlich indirekt durch andere Header eingebunden. Beim GCC auf dem mingw basiert hat man sich viel Mühe gegeben, Headerabhängigkeiten klein zu halten und mit jeder Version fliegen immer mehr raus. Bei VS ist das nicht so die Priorität. Aber man kann sich nicht da drauf verlassen, daher immer das einbinden, was man braucht.
-
Das template <typename T> gehört zu Klasse, du hast hier also das Eingebundene mitten in eine Klassendefinition gestopft. Mach es davor, dann stimmts.
-
Vielen Dank !
Das klappt jetzt schonmal ohne Fehlerendlich ^^
Wäre im Leben nicht auf dieses template gekommen.
Das kommt in keinster Weise vor in den Vorlesungen, alles sehr theoretisch aber so ist es halt ..Werde mich dann mal an die weiteren Möglichkeiten der Listen machen, das sollte ja jetzt dank des funktionsfähigen Grundprinzipes eher laufen, denn theoretisch haben wir das je gelernt die Tage
Danke für die kompetente Hilfe
Darauf kann ich jetzt aufbauen.. so gut es geht ^^#include <stddef.h> template<typename T> class ListElem { public: ListElem(T* d) { next = 0; data = d; } T* getData() { return data; } void setNext (ListElem *n) { next = n; } ListElem* getNext() { return next; } private: T* data; ListElem* next; }; int main() { }
Gibt leider noch keine Ausgaben, mein Ziel wäre es dann Elemente hinzuzufügen und zu löschen..
Danke nochmal und bis wahrscheinlich bald mal