Fehlermeldung "Initialisierung, aber unvollständigen Typ"

studentabc
Windoof-User
Windoof-User
Beiträge: 25
Registriert: 31. Okt 2011 13:56

Fehlermeldung "Initialisierung, aber unvollständigen Typ"

Beitrag von studentabc »

Wir bekommen folgende Fehlermeldung, wenn wir kompilieren:

Code: Alles auswählen

Fehler: Variable »AABB aabb1« hat Initialisierung, aber unvollständigen Typ
Unser Code dazu in der Klasse Triangle:

Code: Alles auswählen

if(typeid(s) == typeid(Triangle))
  {
    Triangle *triangle = (Triangle *) &s;
    AABB aabb1(this->getColor(), this->getAABBMin(), this->getAABBMax());
  }
Leider können wir mit dieser Fehlermeldung gar nichts anfangen.

studentabc
Windoof-User
Windoof-User
Beiträge: 25
Registriert: 31. Okt 2011 13:56

Re: Fehlermeldung "Initialisierung, aber unvollständigen Typ

Beitrag von studentabc »

Obigen Fehler haben wir nun beseitigen können, per Vorwärtsdeklaration, statt dem includen der gesamten Klasse.

Nun bekommen wir folgenden Fehler:

Code: Alles auswählen

falsche Benutzung des unvollständigen Typs »struct Triangle«
Fehler: Vorwärtsdeklaration von »struct Triangle«
Bei folgendem Code in der Klasse AABB:

Code: Alles auswählen

if(typeid(s) == typeid(Triangle))

SupeRalF
Mausschubser
Mausschubser
Beiträge: 56
Registriert: 4. Okt 2010 16:48

Re: Fehlermeldung "Initialisierung, aber unvollständigen Typ

Beitrag von SupeRalF »

Ich kann euch nicht sagen, woran der Fehler genau liegt, aber wir haben es in unserem Projekt so gelöst:

Code: Alles auswählen

if (dynamic_cast<Triangle*> (&s))
der dynamic_cast gibt dir ja einen Pointer vom Typ Triangle* zurück. wenn das Objekt nicht gecastet werden konnte, ist dieser Pointer 0. Da C++ in if-Abfragen ohne Vergleich automatisch einen "!= 0" Vergleich ausführt, wird der THEN teil nur dann ausgeführt, wenn das Objekt nach Triangle* gecastet werden kann.

[Edit:]
Ich bin auch der Meinung, dass ein Downcast per "Triangle *triangle = (Triangle *) &s;" also von Shape nach Triangle gar nicht möglich sein dürfte. Dafür haben wir ebenfalls dynamic_cast verwendet.

studentabc
Windoof-User
Windoof-User
Beiträge: 25
Registriert: 31. Okt 2011 13:56

Re: Fehlermeldung "Initialisierung, aber unvollständigen Typ

Beitrag von studentabc »

Unser Problem liegt in der Vorwärtsdeklaration.
Wenn wir z.B. AABB gegen Triangle bzw. Sphere gegen Triangle nicht machen müssten, würden wir damit kein Problem haben (passend zur Reihenfolge der Deklaration in shapes.h).

Erdi
Erstie
Erstie
Beiträge: 22
Registriert: 1. Nov 2011 18:01

Re: Fehlermeldung "Initialisierung, aber unvollständigen Typ

Beitrag von Erdi »

Hallo,
ich habe gerade genau dasselbe Problem mit der Vorwärtsdeklaration und bekomme es einfach nicht gelöst.
Hat jemand eine Idee, wie man es lösen könnte?

Ich bin für jeden Hinweis dankbar.

danny
Mausschubser
Mausschubser
Beiträge: 51
Registriert: 17. Okt 2010 22:32

Re: Fehlermeldung "Initialisierung, aber unvollständigen Typ

Beitrag von danny »

Ganz dumme Frage, aber hast du in der Datei aabb.cpp auch die Includes für triangle.h et al.?

Erdi
Erstie
Erstie
Beiträge: 22
Registriert: 1. Nov 2011 18:01

Re: Fehlermeldung "Initialisierung, aber unvollständigen Typ

Beitrag von Erdi »

danny hat geschrieben:Ganz dumme Frage, aber hast du in der Datei aabb.cpp auch die Includes für triangle.h et al.?
Ja, das habe ich gemacht, z.B. in ray.h:

Code: Alles auswählen

#include "shapes.h"
#include "aabb.h"
#include "plane.h"
Wenn ich die Includierung von plane.h weglasse hat der Compiler keine Fehler (und ich kann keine Plane-Objekte, erzeugen, was ich nun aber in Ray machen möchte...)
Wenn ich plane.h in ray.h deklariere bekomme ich komischerweise aufeinmal Fehlermeldungen in meiner plane.h die es vorher nicht gab:

Code: Alles auswählen

/home/erdmann/Dokumente/Uni/TUD/WS2011 12/GdI3/SVN/Praktikum/3/src/shapes.h:14:7: Fehler: Vorwärtsdeklaration von »struct Ray«
/home/erdmann/Dokumente/Uni/TUD/WS2011 12/GdI3/SVN/Praktikum/3/src/plane.h:63:25: Fehler: falsche Benutzung des unvollständigen Typs »struct Ray«
/home/erdmann/Dokumente/Uni/TUD/WS2011 12/GdI3/SVN/Praktikum/3/src/shapes.h:14:7: Fehler: Vorwärtsdeklaration von »struct Ray«
/home/erdmann/Dokumente/Uni/TUD/WS2011 12/GdI3/SVN/Praktikum/3/src/plane.h:64:25: Fehler: falsche Benutzung des unvollständigen Typs »struct Ray«
/home/erdmann/Dokumente/Uni/TUD/WS2011 12/GdI3/SVN/Praktikum/3/src/shapes.h:14:7: Fehler: Vorwärtsdeklaration von »struct Ray«
Die Zeilen die dort angegebn sind sind halt Zeilen in denen ich in plane.h irgendwelche ray-Methoden aufrufe.
In plane.h ist ray.h auch includiert worden, also daran kann es auch nicht liegen

danny
Mausschubser
Mausschubser
Beiträge: 51
Registriert: 17. Okt 2010 22:32

Re: Fehlermeldung "Initialisierung, aber unvollständigen Typ

Beitrag von danny »

Hm, das ist so aus der Ferne und ohne minimales, fehlschlagendes Codebeispiel schwer zu sagen.
Es hört sich für mich allerdings so an, als ob du deinen Code in den *.h Dateien schreibst.
Der kommt normalerweise in entsprechende (noch anzulegende) *.cpp Dateien.

Erdi
Erstie
Erstie
Beiträge: 22
Registriert: 1. Nov 2011 18:01

Re: Fehlermeldung "Initialisierung, aber unvollständigen Typ

Beitrag von Erdi »

danny hat geschrieben:Hm, das ist so aus der Ferne und ohne minimales, fehlschlagendes Codebeispiel schwer zu sagen.
Es hört sich für mich allerdings so an, als ob du deinen Code in den *.h Dateien schreibst.
Der kommt normalerweise in entsprechende (noch anzulegende) *.cpp Dateien.
Ja, da hast du recht mit, aber ich dachte, dass dies keine Auswirkungen auf mein Programm hat?

danny
Mausschubser
Mausschubser
Beiträge: 51
Registriert: 17. Okt 2010 22:32

Re: Fehlermeldung "Initialisierung, aber unvollständigen Typ

Beitrag von danny »

Theoretisch sollte es egal sein, ob man seinen Code in den Headern oder den cpp-Dateien implementiert.
Der Vorteil der Implementierung in cpp-Dateien liegt jedoch (unter anderem) darin, dass das Neukompilieren nach Änderungen an einer cpp-Datei sehr viel schneller von statten geht als das Neukompilieren nach einer Änderung an einer Headerdatei.

Falls es bei euch immer noch nicht klappen sollte, würde ich vorschlagen, ihr ladet das Codegerüst nochmal frisch runter und implementiert alle Methoden mal als Stubs, so dass das Projekt kompiliert aber noch nichts wirklich berechnet. Dann könnt ihr ja Schritt für Schritt euren bestehenden Code rüberkopieren und in jedem Schritt schauen, ab wann der Compiler nicht mehr will. Dann sollte man die Problemquelle eigentlich sehr stark eingeschränkt haben.
Zuletzt geändert von danny am 18. Dez 2011 13:52, insgesamt 1-mal geändert.

manchot
Neuling
Neuling
Beiträge: 2
Registriert: 13. Okt 2010 16:37

Re: Fehlermeldung "Initialisierung, aber unvollständigen Typ

Beitrag von manchot »

Wir haben uns mit diesem Fehler auch lange herumgeschlagen, bis wir genau das gemacht haben: Den Code stück für stück reinkopiert.
Zum Schluss lag es daran, dass wir eben alles in den Headern mit inline implementiert haben. Als der Code dann in den jeweiligen cpp Dateien war, lief plötzlich wieder alles...

Ankou
Mausschubser
Mausschubser
Beiträge: 85
Registriert: 15. Mai 2011 18:23

Re: Fehlermeldung "Initialisierung, aber unvollständigen Typ

Beitrag von Ankou »

wenn ihr den Code in den Headern habt reichen Vorwärtsdeklarationen nicht mehr, mit denen kannst du Pointer oder Referenzen auf den Typ deklarieren, aber keine Methoden darauf aufrufen oder sonstwie damit wirklich arbeiten, es ist dann notwendig, dass ihr in den headern z.B. aabb.h inkludiert und dann habt ihr vermutlich zyklische includes, sowas wie aabb.h inkludiert ray.h und ray.h inludiert aabb.h und das geht kaputt(wegen den Includeguards auf eher subtile Weise, es wird eine praktisch leere Datei inkludiert)

Antworten

Zurück zu „Archiv“