Forward Declaration funktioniert nicht



  • Hallo,
    ich hätte nicht gedacht, dass ich bei solch einem Problem stecken bleibe...

    Ich habe ein Header File namens Level.h:

    #pragma once
    
    namespace GameEngine
    {
        class LevelParser;
    
        class Level
        {
            friend class LevelParser;
        public:
     
           // ...
    
        private:
            Level();
        };
    }
    

    LevelParser.h inkludiert direkt Level.h (wegen dem std::unique_ptr)

    #pragma once
    
    #include "Level.h"
    #include <memory>
    
    namespace GameEngine
    {
        class Layer;
    
        class LevelParser
        {
        public:
            std::unique_ptr<Level> parseLevel(const char* levelFile);
        };
    }
    

    Das LevelParser.cpp sieht so aus:

    #include "GameEngine/LevelParser.h"
    
    namespace GameEngine
    {
    
        std::unique_ptr<Level> LevelParser::parseLevel(const char *levelFile)
        {
            auto level = std::make_unique<Level>(); // FEHLER: In template: calling a private constructor of class 'GameEngine::Level'
            // ...
    
            return level;
        }
    }
    

    In Zeile 8 bekomme ich nun den Fehler, dass ich den privaten Konstruktor von Level aufrufe.

    Was mache ich falsch?

    Danke im Voraus!
    Steffo


  • Mod

    Ja, das ist ein bisschen doof von der Art her, wie das hier funktioniert. LevelParser mag zwar ein Freund von Level sein, aber make_unique<Level> ist es nicht, und das ist es, was hier den Konstruktor aufrufen will. Alternative: auto level = std::unique_ptr<Level>(new Level());



  • Ach du Sch... 😳
    Ich erinnere mich: Tatsächlich hatte ich ein einziges Mal dieses Problem und ein Kollege hat mich darauf hingewiesen...
    Leider hat C++ zu viele Fallstricke. 😞

    Danke für die Lösung jedenfalls!


Log in to reply