Wie extern template richtig nutzen?



  • Ich spiele gerade mit extern template herum. Folgendes Beispiel erzeugt bei mir eine Fehler in der IDE, nicht aber beim Kompilieren:

    // test.h
    template<class T> struct foo {
    	T bar;
    };
    
    extern template struct foo<int>;
    
    #include "test.h"
    
    template struct foo<int>;
    
    int main()
    {
    	foo<int> baz;
    	baz.bar = 42;
        return 0;
    }
    

    Visual C++ 2017 meint in der IDE zu test.h 'extern template' cannot follow explicit instantiation of class "foo<int>" , frisst den Code aber ohne eigentliche Compiler Warnung.

    Mache ich grundsätzlich etwas falsch oder ist das einfach eine Macke?



  • extern soll die Instanziierung in einer Datei bzw sehr vielen Dateien verhindern. Folgende Dateien compilieren und linken geht:

    // test.h
    template<class T> struct foo {
        T bar;
    };
    
    // test.cpp
    #include "test.h"
    
    extern template struct foo<int>;	// hier nicht inst.
    
    int main()
    {
        foo<int> baz;
        baz.bar = 42;
        return 0;
    }
    
    // instanz.cpp
    #include "test.h"
    template struct foo<int>;
    

    Dateien wie test.cpp könnte es viele geben. Die Instanziierung läüft nur einmal. Meinst Du es so?


Log in to reply