Templates: *.h und *.cpp trennen



  • Hallo,

    ich suche nach einer Lösung wie ich templates in einer Klasse verwenden kann, die auf mehrere Dateien (*.h und *.cpp) aufgeteilt ist. Es sollen dabei Methoden als Rückgabewert dieses Template haben, und überschrieben werden.

    Allerdings habe ich gehört, dass das schwierig ist. Ist das möglich?!



  • Ich versteh nicht ganz, was du machen willst. Aber solange du nicht gerade den Comeau-Compiler benutzt (und damit auf export zurückgreifen kannst), vergiß es. (Nichtexportierte) Template-Definitionen müssen an der Instanziierungsstelle sichtbar sein.



  • Solange die meisten Compiler export nicht können, kann man sich eines netten Tricks bedienen. Und zwar:

    // test.hh
    
    #ifndef INCLUDED_TEST_HH
    #define INCLUDED_TEST_HH
    
    template <typename t> struct test {
      t foo();
    };
    
    #include "test.tcc"
    
    #endif
    
    //test.tcc
    template <typename t> t test<t>::foo() { return t(); }
    


  • Bashar schrieb:

    Ich versteh nicht ganz, was du machen willst. Aber solange du nicht gerade den Comeau-Compiler benutzt (und damit auf export zurückgreifen kannst), vergiß es. (Nichtexportierte) Template-Definitionen müssen an der Instanziierungsstelle sichtbar sein.

    und somit is das ganze nur durch sowas dummes wie das hier möglich:

    //code.h
    template<class T>
    class foo{
        public:
            void bar();
            template<class U>
            foo<U> foobar(foo<U>);
    };
    #include "code.cpp"
    //code.cpp
    template<class T>
    void foo<T>::bar(){} 
    
    //jetzt wirds richtig intressant:
    template<class T>
    template<class U>
    foo<U> foo<T>::foobar(foo<U> x){}
    //muhahah :D
    

    noch krasser wird das ganze mit namespaces und/oder nested classes, aber des lass ich mal 😃



  • hmmm ist das jetzt absicht mit dem tcc? muss ich das format kennen?



  • Die Erweiterung einer include Datei spielt gar keine Rolle.


Log in to reply