Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

12.11.2015, 00:55

Problem mit .inl Datei

Hallo zusammen!
Ich arbeite derzeit das Buch "SFML Game Development" durch, in welchem Schritt für Schritt der Aufbau eines Frameworks für 2D Spiele erklärt wird.
Nun habe ich aber ein kleines Problem. Es geht um eine ResourceHandler Klasse, die (wie der Name schon sagt) für das verwalten der Ressourcen im Spiel zuständig sein soll.
Dafür werden im Buch templates genutzt um sich nicht auf einen bestimmten Datentyp (z.B. sf::Texture) festlegen zu müssen.

Nun steht in dem Buch weiterhin, dass beim benutzen von templates die komplette Klassenimplementierung in der Header Datei sattfinden muss. Um die Definitionen trotzdem in eine andere
Datei schreiben zu können wird auf .inl Dateien verwiesen.

So sieht nun meine Header Datei aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <map>
#include <memory>
#include <string>
#include <cassert>
#include <stdexcept>

#pragma once

namespace LE
{
    template <typename Resource, typename Identifier>

    class ResourceHolder
    {
        public:
            void                                load(Identifier id, const std::string& filename);

            template <typename Parameter>
            void                                load(Identifier id, const std::string& filename, const Parameter& secondParam);

            Resource&                           get(Identifier id);

            const Resource&                     get(Identifier id) const;

        private:
            std::map <Identifier, std::unique_ptr<Resource>> mResourceMap;

            void                                insertResource(Identifier id, std::unique_ptr<Resource> resource);
    };
}

#include "ResourceHolder.inl"


meine inline Datei sieht so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
namespace LE
{


    template <typename Resource, typename Identifier>
    void ResourceHolder<Resource, Identifier>::load(Identifier id, const std::string& filename)
    {
        // Create and load resource
        std::unique_ptr<Resource> resource(new Resource());
        if (!resource->loadFromFile(filename))
            throw std::runtime_error("ResourceHolder::load - Failed to load " + filename);

        // If loading successful, insert resource to map
        insertResource(id, std::move(resource));
    }

    template <typename Resource, typename Identifier>
    template <typename Parameter>
    void ResourceHolder<Resource, Identifier>::load(Identifier id, const std::string& filename, const Parameter& secondParam)
    {
        // Create and load resource
        std::unique_ptr<Resource> resource(new Resource());
        if (!resource->loadFromFile(filename, secondParam))
            throw std::runtime_error("ResourceHolder::load - Failed to load " + filename);

        // If loading successful, insert resource to map
        insertResource(id, std::move(resource));
    }

    template <typename Resource, typename Identifier>
    Resource& ResourceHolder<Resource, Identifier>::get(Identifier id)
    {
        auto found = mResourceMap.find(id);
        assert(found != mResourceMap.end());

        return *found->second;
    }

    template <typename Resource, typename Identifier>
    const Resource& ResourceHolder<Resource, Identifier>::get(Identifier id) const
    {
        auto found = mResourceMap.find(id);
        assert(found != mResourceMap.end());

        return *found->second;
    }

    template <typename Resource, typename Identifier>
    void ResourceHolder<Resource, Identifier>::insertResource(Identifier id, std::unique_ptr<Resource> resource)
    {
        // Insert and check success
        auto inserted = mResourceMap.insert(std::make_pair(id, std::move(resource)));
        assert(inserted.second);
    }
}




Beim compilieren meckert nun der Compiler:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Schweregrad Code    Beschreibung    Projekt Datei   Zeile
Fehler  C2988   Unerkannte Vorlagendeklaration/-definition  sfml_game_development   c:\users\luca\documents\visual studio 2015\projects\sfml_game_development\sfml_game_development\resourceholder.inl  6
Fehler  C2143   Syntaxfehler: Es fehlt ";" vor "<"  sfml_game_development   c:\users\luca\documents\visual studio 2015\projects\sfml_game_development\sfml_game_development\resourceholder.inl  6
Fehler  C2182   "ResourceHolder": Unzulässige Verwendung des Typs "void"   sfml_game_development   c:\users\luca\documents\visual studio 2015\projects\sfml_game_development\sfml_game_development\resourceholder.inl  6
Fehler  C2059   Syntaxfehler: "<"   sfml_game_development   c:\users\luca\documents\visual studio 2015\projects\sfml_game_development\sfml_game_development\resourceholder.inl  6
Fehler  C2143   Syntaxfehler: Es fehlt ";" vor "{"  sfml_game_development   c:\users\luca\documents\visual studio 2015\projects\sfml_game_development\sfml_game_development\resourceholder.inl  20
Fehler  C2447   "{": Funktionsheader fehlt - Parameterliste im alten Stil?  sfml_game_development   c:\users\luca\documents\visual studio 2015\projects\sfml_game_development\sfml_game_development\resourceholder.inl  20
Fehler  C2988   Unerkannte Vorlagendeklaration/-definition  sfml_game_development   c:\users\luca\documents\visual studio 2015\projects\sfml_game_development\sfml_game_development\resourceholder.inl  31
Fehler  C2143   Syntaxfehler: Es fehlt ";" vor "<"  sfml_game_development   c:\users\luca\documents\visual studio 2015\projects\sfml_game_development\sfml_game_development\resourceholder.inl  31
Fehler  C2040   "LE::ResourceHolder": "Resource &" unterscheidet sich von "int" in Bezug auf die Anzahl vorgenommener Dereferenzierungen    sfml_game_development   c:\users\luca\documents\visual studio 2015\projects\sfml_game_development\sfml_game_development\resourceholder.inl  31
Fehler  C2059   Syntaxfehler: "<"   sfml_game_development   c:\users\luca\documents\visual studio 2015\projects\sfml_game_development\sfml_game_development\resourceholder.inl  31
Fehler  C2143   Syntaxfehler: Es fehlt ";" vor "{"  sfml_game_development   c:\users\luca\documents\visual studio 2015\projects\sfml_game_development\sfml_game_development\resourceholder.inl  41
Fehler  C2447   "{": Funktionsheader fehlt - Parameterliste im alten Stil?  sfml_game_development   c:\users\luca\documents\visual studio 2015\projects\sfml_game_development\sfml_game_development\resourceholder.inl  41
Fehler  C2988   Unerkannte Vorlagendeklaration/-definition  sfml_game_development   c:\users\luca\documents\visual studio 2015\projects\sfml_game_development\sfml_game_development\resourceholder.inl  49
Fehler  C2143   Syntaxfehler: Es fehlt ";" vor "<"  sfml_game_development   c:\users\luca\documents\visual studio 2015\projects\sfml_game_development\sfml_game_development\resourceholder.inl  49
Fehler  C2182   "ResourceHolder": Unzulässige Verwendung des Typs "void"   sfml_game_development   c:\users\luca\documents\visual studio 2015\projects\sfml_game_development\sfml_game_development\resourceholder.inl  49
Fehler  C2374   "LE::ResourceHolder": Neudefinition; Mehrfachinitialisierung    sfml_game_development   c:\users\luca\documents\visual studio 2015\projects\sfml_game_development\sfml_game_development\resourceholder.inl  49
Fehler  C2059   Syntaxfehler: "<"   sfml_game_development   c:\users\luca\documents\visual studio 2015\projects\sfml_game_development\sfml_game_development\resourceholder.inl  49
Fehler  C2143   Syntaxfehler: Es fehlt ";" vor "}"  sfml_game_development   c:\users\luca\documents\visual studio 2015\projects\sfml_game_development\sfml_game_development\resourceholder.inl  55



Ich habe alles so gemacht wie im Buch erläutert, erhalte dennoch diesen Fehler. Hat vielleicht jemand eine Idee, woran das liegen könnte?

LG
Luca

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

12.11.2015, 01:11

Kanns sein dass du irgendwo ein zirkuläres #include hast?

3

12.11.2015, 10:27

Hm, hab keins entdeckt.
Ich hab nur die #include "ResourceHolder.inl" in der Header.

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

4

12.11.2015, 10:31

Versuche mal, die .inl vom Kompilierungsprozess auszuschließen. Evtl. sieht der Compiler sie als zusätzliche Quelldatei und versucht sie zu einem eigenständigen .o-File zu compilen, obwohl er das eigentlich nicht sollte.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

5

12.11.2015, 10:53

Nimelrian: Ja genau das scheint das Problem gewesen zu sein. Ich vermute es lag daran, dass ich eine ursprüngliche cpp Datei in eine inline Datei umbenannt habe.
Habe eine neue, eigenständige Datei angelegt und den Code kopiert. Jetzt funktioniert alles! :)
Vielen Dank für eure Hilfe! :thumbsup:

Werbeanzeige