spezialisierte Template-Klasse mit Unterklasse in Dll exportieren



  • Hallo,

    ich möchte eine spezialisierte Template-Klasse, die eine Unterklasse enthält, in eine DLL exportieren. Leider klappt der Export dieser Unterklasse (CSub) nicht. Die Methoden der Hauptklasse (CMain) werden aber ordnungsgemäß exportiert.

    template <class T>
    class CMain
    {
    public:
        class /*__declspec(dllexport)*/ CSub
        {
            friend class CMain<T>;
        public:
            CSub();
            virtual ~CSub();
            // .. und weitere Methoden bzw. Membervariablen
        };
        CVector();
        virtual ~CVector();
       // .. und weitere Methoden bzw. Membervariablen
    };
    // Spezialisierung und Export der Hauptklasse
    template class __declspec(dllexport) CMain<double>;
    

    die folgende Variante, nach der Spezialisierung der Hauptklasse, die Unterklasse zu exportieren, habe ich schon vergeblich probiert.

    __declspec(dllexport) CMain<double>::CSub; //geht auch nicht
    

    Auch die Variante (siehe Zeile 5 (auskommentiert) im Beispiel) das __decspec(dllexport) vor die Deklaration der Unterklasse zu setzen, funktioniert nicht. Da in der DLL laut Dependencywalker nun zwar der Unterklassenname auftaucht aber trotzdem die Methoden fehlen.
    Wer kann mir weiterhelfen?



  • Nur zur Information, falls noch jemand auf das Problem stößt. Es läßt sich wie folgt umgehen.

    template <class T> class CMain; //damit CMain in CSub bekannt, wegen friend deklaration
    
    // externe Deklaration der eigentlichen Unterklasse
    template <class T>
    class CSub
    {
        friend class CMain<T>;
    public:
        CSub();
        virtual ~CSub();
        // .. und weitere Methoden bzw. Membervariablen
    };
    
    template <class T>
    class CMain
    {
    public:
        typedef CSub<T> CSub; //hier wird CSub zur Unterklasse gemacht
        CVector();
        virtual ~CVector();
       // .. und weitere Methoden bzw. Membervariablen
    };
    
    // Spezialisierung und Export der Unterklasse und der Hauptklasse
    template class __declspec(dllexport) CSub<double>;
    template class __declspec(dllexport) CMain<double>;
    


  • CVector() und virtual ~CVector() ist natürlich Quatsch, das ist CMain jeweils.


Anmelden zum Antworten