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;
    };
    

  • Mod

    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 ein VT bzw TR 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 er VT* bzw TR* als Zeiger auf eine Klasseninstanz interpretieren kann, aber er braucht gar nicht zu wissen, wie ein VT 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.


Anmelden zum Antworten