multiple definition



  • Hi,
    folgendes Konstrukt:

    // A.h
    #ifndef A_H
    #define A_H
    
    template<typename T>
    class A
    {
    public:
    	static unsigned short const us;
    };
    
    #endif // A_H
    
    // B.h
    #ifndef B_H
    #define B_H
    
    #include "A.h"
    
    class B : public A<B>
    {
    };
    
    #endif // B_H
    
    // B.cpp
    #include "../Header/B.h"
    
    template<>
    unsigned short const A<B>::us = 12;
    

    In main wird dann einfach nur eine variable von B angelegt und auf us zugegriffen.
    Mit MS Visual C++ 2005 Beta ging alles problemlos. Jetzt gibts Probleme wenn ich mit dev cpp arbeite.
    Linker Fehler ist

    Source/B.o(.rdata+0x0):B.cpp: multiple definition of `A<B>::us'
    Source/Main.o(.rdata+0x0):Main.cpp: first defined here
    collect2: ld returned 1 exit status
    

    Jemand eine Idee, was falsch ist?

    Gruss,
    DeSoVoDaMu



  • Hmm ist der zweiter Compiler der gcc?

    Kann sein, dass dieser die statische Variable beim Instanziieren der Klasse ebenenfalls instanziiert, während der MS-Compiler dies nicht tut.

    Generell solltest du die statische Variable vielleicht besser vom Template selbst instanziieren lassen und den Wert z.B. als 2. Templateparameter übergeben...



  • Ja, der Compiler ist gcc.
    Prinzipiell hast du recht - ich könnte die Konstante einfach als Template Parameter übergeben. Da ich im richtigen Programm (das ist nur eine Vereinfachung) aber mehr als nur eine Konstante habe und auch eine leichte Erweiterbarkeit gegeben sein soll, ist mir dieser Weg lieber.

    Edit: Compiler ist natürlich g++ 😃



  • ..aber mehr als nur eine Konstante

    Du hast in beiden Fällen für jede Ausprägung eine statische Variable. Bei dir ist allerdings nur die Deklaration im Template enthalten, so dass du die Variable nochmal für jede Ausprägung separat instanziieren musst.
    (unschön und überflüssig)

    g++ instanziiert wenn ich mich recht entsinne statische Variablen von basistypen automatisch. Der MS-Compiler macht das nicht.

    Ich hoffe dies hier funktioniert mit beiden Compilern:

    template <class T, int Value = 12>
    class TBeispiel
    {
      static int sm_Beispiel; 
    } 
    
    int TBeispiel<T, Value>::sm_Beispiel = Value;
    


  • Eigentlich sieht das so ok aus. Wie sieht denn die main.cpp aus?



  • ok, problem scheint geloest. Irgendwo schrieb mal jemand, dass es probleme gab, wenn man die header direkt mit im Projekt hat o_O

    Thx für die Antworten.

    Gruss,
    DeSoVoDaMu


Anmelden zum Antworten