... does not name a type



  • Hallo!

    Ich hab mir jetzt schon viele verschiedene Tutorials durchgelesen zum Thema OOP und wollte nun erste Schritte wagen zusammen mit der Improved Console, doch leider kommen direkt am Anfang schon die ersten Probleme.

    // main.cpp
    #include <iostream>
    #include <conio.h>
    
    #include "ic.hpp"
    
    #include "basetile.h"
    
    using namespace ic;
    using namespace ic::shorties;
    using namespace std;
    
    int main()
    {
    	// todo
    
    	getch();
    	return 0;
    }
    
    // basetile.h
    #ifndef CBASETILE_H
    #define CBASETILE_H
    
    class CBaseTile
    {
    	protected:
    		char		m_cSymbol;
    		TextColor	m_eFG;
    		BgColor		m_eBG;
    	public:
    					CBaseTile( void );
    					~CBaseTile( void );
    
    		char		GetSymbol( TextColor& f, BgColor& b );
    };
    
    #endif
    

    Der Compiler meldet mir nun "... does not name a type" sowohl für TextColor, als auch für BgColor.
    Das ist eigentlich auch verständlich, die Typen aus der ic.hpp sind hier nicht bekannt. Aber was muss ich tun, um sie in meinen Klassen verwenden zu können? Das Einbinden der ic.hpp in der Header-Datei zu meiner Klasse hat auch nicht geholfen.

    Ich denke mir fehlt hier fundamentales Wissen in der OOP, denn ich hatte schon öfters Probleme mit gegenseitigem Einbinden von Headern usw.

    Danke für jede Hilfe 🙂



  • Hi,

    ich nehme mal an, dass du die ic.cpp auch in dein Projekt aufgenommen hast, oder? Dein Fehler an der ganzen Sache ist der, dass du lediglich in der main.cpp die ic.hpp inkludiert hast, nicht aber korrekterweise in der basetile.h, wo sich die Klassendeklaration befindet. Der Compiler versucht natürlich, die in deiner Klasse deklarierten Objekte zu suchen, und findet keine. Du musst die ic.hpp in der basetile.h inkludieren, nicht in der main. Auch das:
    using namespace ic;
    using namespace ic::shorties;
    musst du in die basetile.h stecken. Dann klappt es. Hier nochmal die Zusammenfassung:

    // basetile.h
    #ifndef CBASETILE_H
    #define CBASETILE_H
    
    #include "ic.hpp"
    using namespace ic;
    using namespace ic::shorties;
    
    class CBaseTile
    {
        protected:
            char        m_cSymbol;
            TextColor    m_eFG;
            BgColor        m_eBG;
        public:
                        CBaseTile( void );
                        ~CBaseTile( void );
    
            char        GetSymbol( TextColor& f, BgColor& b );
    };
    
    #endif
    
    // main.cpp
    #include <iostream>
    #include <conio.h>
    #include "basetile.h"
    
    using namespace std;
    
    int main()
    {
        // todo
    
        getch();
        return 0;
    }
    

    ...und es klappt 🙂 (Und das nächste mal einen aussagekräftigeren Titel, kein Wunder dass hier niemand reingeguckt hat)



  • Danke, das wars also, ich hab versucht gehabt die ic.hpp im Header zu inkludieren, hab aber den Namensraum total vergessen ^^

    Aber es spricht nichts dagegen, das ganze auch in der main zu lassen, sofern ich die Funktionalität dort benötige oder?



  • Was willst du denn in der main lassen? Die Namespaces? Dann klappt es ja nicht 😉



  • Nein, ich mein jetzt, dass ich die ic.hpp sowohl in meinem Header als auch in der main.cpp inkludiere (und den Namensraum zuweise), um von dort auch Zugriff auf die ic.hpp zu haben. Oder ist das unnötig weil ich in der main.cpp die basetile.h einbinde, welche wiederum die ic.hpp einbindet und ich somit eh Zugriff habe? ^^



  • Oder ist das unnötig weil ich in der main.cpp die basetile.h einbinde, welche wiederum die ic.hpp einbindet und ich somit eh Zugriff habe? ^^

    Richtig erkannt. Der von dir eingebaute Include Guard würde das zweifache Einbinden sowieso verhindern 😉



  • Alles klar, danke!

    Ich sollte mich da echt mal n bisschen einlesen, ist noch alles sehr verwirrend ^^



  • mikey schrieb:

    Auch das:
    using namespace ic;
    using namespace ic::shorties;
    musst du in die basetile.h stecken.

    Böse, sehr böse - wenn du solche Tips gibst, solltest du auch darauf hinweisen, wie gefährlich sowas ist (in der Testanwendung hast du da vielleicht keine Probleme, aber im produktiven Code streikt der Compiler plötzlich wegen genau der Namenskonflikte, die der Namespace eigentlich verhindern sollte).



  • Sorry, ich hätte vielleicht noch auf die möglichen Konflikte mit den Namespaces hinweisen sollen. Aber bei dem Beispiel ist das ja kein Problem.
    @Dienes: Alternativ kannst du das using namespace ganz weglassen, und vor jedem Bezeichner einfach ic:: etc. setzen.


Anmelden zum Antworten