aha, non-class type, obwohl als Klasse definiert?
-
Hi,
ganz schnell: folgenden Code habe nach einem älteren Buch geschrieben:-----------
class ListenElement
{
friend class Liste;protected:
ListenElement(ListenElement *p=0, ListenElement *n=0) : previous(p), next(n){}
ListenElement *previous;
ListenElement *next;public:
void Print(void) {cout << this << endl;}
ListenElement(void) : previous(0),next(0){}
};class IntElement : public ListenElement
{
private:
int data;
public:
IntElement(int, ListenElement*, ListenElement*);
void Print(void) {cout << data << endl;}
};IntElement::IntElement(int d, ListenElement *p=0, ListenElement *n=0) : data(d), ListenElement(p,n) {}
ListenElement le();
IntElement ie(20,0,0);
int main(void)
{le.Print();
ie.Print();
}-----------------------
bekomme aber beim Kompilieren folgende Fehlermeldung:
request for member âPrintâ in âleâ, which is of non-class type âListenElement ()()â
.. was sich auf den Funktionsaufruf le.Print() bezieht.
Wurde mit g++ 4.1.3 kompiliert.A propos: wie bringe ich die Shell/das Terminal dazu, mir schöne "" statt â anzuzeigen?
Danke für jede Hilfe,
Jens
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Ah, der Klassiker:
Ichbins-Jens schrieb:
... ListenElement le(); ...Vergleiche das mal mit
int f();Na ? Was deklarierst Du damit ?

genausowenig, wie Du
int i();schreibst, wenn Du eine integer-Variable deklarierst, brauchst Du oben die "()"...
Gruß,
Simon2.
BTW: Bitte cpp-tags verwenden ...
-
ListenElement le();
Der Compiler siehtlehier nicht als Objekt, sondern als Funktionsdeklaration. Richtig wäre es ohne die Klammern:
ListenElement le;Und zum zweiten Problem:
Da müsste man wissen, welches Betriebsystem du benutzt und du wärst damit sowieso im falschen Forum. Also ka ...Grüssli
-
Aha, verstehe^^. Danke. Ja, ich habe die Klammern eingefügt, obwohl es ohne im Buch stand. Aber ohne bekomme ich folgende Fehlermeldung:
list.cpp:30: error: call of overloaded âListenElement()â is ambiguous
list.cpp:16: note: candidates are: ListenElement::ListenElement()
list.cpp:10: note: ListenElement::ListenElement(ListenElement*, ListenElement*)Wobei doch klar sein sollte, welcher Konstruktor angesprochen werden soll? Schließlich ist der andere protected. Naja, dann kam ich auf die Idee, mit den Klammern anzugeben, welchen ich denn meine. Aber das ist wohl in die Hose gegangen.
Was soll ich jetzt tun?

-
Habe jetzt dem jenigen Konstruktor mit leerer Argumentliste einfach noch ein "int a" eingefügt, das aber nicht weiter benutzt wird. dann funktioniert der Aufruf "ListenElement le(0);"
Aber sonderlich elegant ist das nicht, was meint Ihr?
-
Ichbins-Jens schrieb:
Wobei doch klar sein sollte, welcher Konstruktor angesprochen werden soll? Schließlich ist der andere protected. Naja, dann kam ich auf die Idee, mit den Klammern anzugeben, welchen ich denn meine. Aber das ist wohl in die Hose gegangen.
Nein, so klug ist der Compiler nicht und darf er auch nicht sein. Du hast nämlich zweimal den Default-Konstruktor.
ListenElement(ListenElement *p=0, ListenElement *n=0);
Kann man auch sehen als:
ListenElement();Also am besten diese Defaultwerte rausnehmen:
ListenElement(ListenElement *p, ListenElement *n);Grundsätzlich hast du den Konstruktor mit den Defaultwerten bereits als Konstruktor, musst dies somit nicht noch einmal angeben

Grüssli
-
Herzlichen Dank, schon wieder Stunden der Verzweiflung gespart
