Undefined reference bei Funktionen-Template



  • Hi,

    folgendes:

    //types.h
    #ifndef TYPES_H_INCLUDED
    #define TYPES_H_INCLUDED
    #include <memory>
    #include <unordered_map>
    #include <vector>
    
    typedef unsigned int Type;
    
    Type global_type = 0;
    
    template <typename T>
    Type getType()
    {
        static Type mytype = global_type++;
        return mytype;
    }
    
    [...]
    #endif 
    //component.h
    #ifndef COMPONENT_H_INCLUDED
    #define COMPONENT_H_INCLUDED
    #include "../types.h"
    
    class BaseComponent
    {
    private:
    
    public:
        BaseComponent()
        {}
    };
    
    template <typename T>
    class Component
    :public BaseComponent
    {
    public:
        static Type type(){return getType<T>();}
    };
    
    #endif // COMPONENT_H_INCLUDED
    

    wirft:

    c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\mingw32\bits\gthr-default.h|403|multiple definition of `global_type'|

    mit Verweis auf irgendeine esoterisch aussehenden Standardlib.

    Standardlösung:
    Definition und Deklaration in verschiedene Dateien. Hier ist es aber ein Template. Was tun? Oder liegt der Fehler irgendwo anders? "global_type" taucht garantiert nur genau dort auf.

    Vielen Dank für jede Hilfe 🙂


  • Mod

    global_type ist doch kein Template, sondern ein ganz normaler unsigned int, ganz unabhängig von seiner Benutzung in get_type. Das geht natürlich schief, wenn man den im Header definiert. Also: Im Header nur deklarieren (extern) und dann in einer Quellcodedatei definieren.

    Was genau willst du hier eigentlich zählen? Das sieht wie etwas aus, das man sicher auch eleganter lösen könnte.



  • Also: Im Header nur deklarieren (extern) und dann in einer Quellcodedatei definieren

    Danke!

    Was genau willst du hier eigentlich zählen?

    Zählen streng genommen gar nichts, sondern Typen Integern zuweisen, damit ich z.B. std::unordered_map<Type, std::vector<Entities>> schreiben kann.

    Bin offen für andere Ideen 🙂


  • Mod

    kingcools schrieb:

    Was genau willst du hier eigentlich zählen?

    Zählen streng genommen gar nichts, sondern Typen Integern zuweisen, damit ich z.B. std::unordered_map<Type, std::vector<Entities>> schreiben kann.

    Kannst du ein Beispiel geben, wie du dir die Anwendung vorstellst, bzw. wie es derzeit funktioniert?


Log in to reply