Bei Compilieren taucht der Fehler "nichtdeklarierter Bezeichner" auf
-
In dem Headerfile VT.h taucht der Fehler "nichtdeklarierter Bezeichner" in Zeile 20 auf. Ich habe keine Ahnung warum an der Stelle das TR nicht akzeptiert wird. TR.h ist inkludiert und sonst sehe ich eigentlich auch keinen Grund warum es ein Problem geben könnte.
Es wäre schön wenn mir jemand damit Helfen kann.VT.h:
#pragma once #include "TR.h" #include "vec3.hpp" #include <vector> using namespace std; struct VT { glm::vec3 positions; int index; VT* candidate; float cost; vector<VT*> nachbarn; vector<TR*> faces; bool rPunkt; int valenz; };
TR.h:
#pragma once #include "VT.h" #include "vec3.hpp" class TR { public: VT* vertexs[3]; glm::vec3 normals; };
-
Zirkulärer Include, VT.h macht
#include "TR.h"
und umgekehrt. Irgendwann muss das natürlich aufhören, und tut es auch nach der ersten Runde. Wer immer dann vorne steht -- hier wohl VT.h -- hat dann an der entsprechenden Stelle noch nie den anderen Header gesehen, und hat daher keine Ahnung, was einVT
bzwTR
ist.Lösung: Für Pointer (oder Referenzen) auf Objekte einer Klasse brauchst du überhaupt gar nicht die genaue Klassendefinition. Es wird ja quasi nichts gemacht, der Compiler muss bloß wissen, dass
VT
bzw.TR
eine Klasse ist, damit erVT*
bzwTR*
als Zeiger auf eine Klasseninstanz interpretieren kann, aber er braucht gar nicht zu wissen, wie einVT
bzw.TR
genau ausschaut, bloß um einen Zeiger darauf zu erzeugen. Und wie macht man das? Stichwort: Forward declaration.class TR; // Jetzt weiß der Compiler, dass `TR` eine Klasse ist […] vector<TR*> faces; // Jetzt versteht er, dass `TR*` ein Zeiger ist
Sprich: Lass die Includes von VT.h bzw. TR.h weg, und schreib stattdessen nur
class VT;
bzw.class TR;
da hin.
-
Hat geklappt. Danke für die schnell Hilfe.