Fehler bei Memberfunktionsdeklaration in einer Template-Klasse



  • Hallo,
    ich wollte mir eine kleine Template-Klasse schreiben, und konnte nach ein paar Zeilen wiedereinmal gleich wieder einpacken:

    template<class T> class CRegValue
    {
    private:
        HKEY       RootKey;
        AnsiString Key;
        AnsiString Value;
        TRegistry* Reg;
    
    public:
        CRegValue(AnsiString key, AnsiString val);
        void Activate(TRegistry* reg);
        void Set(T* val);
        T* Get();
    };
    //---------------------------------------------------------------------------
    
    template<class T> CRegValue::CRegValue(AnsiString key, AnsiString val)
    {
       Key = key;
       Value = val;
    }
    //---------------------------------------------------------------------------
    

    Ich bekomme die Fehler

    [C++Fehler] MainWindow.cpp(28): Invalid use of template 'CRegValue'.
    [C++Fehler] MainWindow.cpp(28): Invalid use of template 'CRegValue'.
    [C++Fehler] MainWindow.cpp(28): Declaration terminated incorrectly.

    Ich benutze den Borland C++Builder 3. Mache ich was falsch?



  • Hi,
    müsste das nicht
    template<class T> CRegValue<T>::CRegValue(AnsiString key, AnsiString val)
    heissen?



  • rincewind schrieb:

    Hi,
    müsste das nicht
    template<class T> CRegValue<T>::CRegValue(AnsiString key, AnsiString val)
    heissen?

    Öhm, ja. Komisch, das hatte ich in den Codes aus der Suchfunktion nicht gesehen... Naja, auf jeden Fall vielen Dank, rincewind.



  • So, jetzt würde ich gerne in einer Memberfunktion der Klasse herausfinden, ob T ein Integer oder ein AnsiString ist. Geht das?



  • Nicht wirklich. Am einfachsten ist es wohl, für 'int' und 'AnsiString' (die Klassen) zu spezialisieren.



  • Ich hab jetzt eine Memberfunktion deklarieren wollen:

    void template<class T> CRegValue<T>::Activate(TRegistry* reg)
    {
       Reg = reg;
       Reg->RootKey = RootKey;
    }
    

    und bekomme die Fehlermeldungen

    [C++Fehler] MainWindow.h(47): Declaration terminated incorrectly.

    Was ist denn jetzt schon wieder falsch? 😕



  • hi
    und die template deklaration is genau die gleiche wie weiter oben beschrieben ?



  • Ja. Ich poste nochmal den ganzen Code. Die Fehler darin sind markiert:

    enum TValType {vtStr, vtDWORD};
    
    template<class T> class CRegValue
    // T sollte sein:
    // - ein AnsiString, falls Type == vtStr
    // - ein DWORD-Wert, falls Type == vtDWORD
    {
    private:
        HKEY        RootKey;
        AnsiString  Key;
        AnsiString  Value;
        TValType    Type;
        TRegistry*  Reg;
    
    public:
        CRegValue(HKEY root, AnsiString key, AnsiString val, TValType vt);
        void Activate(TRegistry* reg);
        void Set(T val);
        T Get();
    };
    //---------------------------------------------------------------------------
    
    template<class T> CRegValue<T>::CRegValue(HKEY root, AnsiString key, AnsiString val, TValType vt)
    {
       RootKey = root;
       Key = key;
       Value = val;
       Type = vt;
    }
    //---------------------------------------------------------------------------
    
    // HIER DER ERSTE FEHLER
    // WENN ICH void WEGLASSE, DANN GEHT'S. ABER DANN KANN ICH DIE FUNKTION
    // NICHT MIT EINER KLASSENINSTANZ BENUTZEN
    void template<class T>  CRegValue<T>::Activate(TRegistry* reg)
    {
       Reg = reg;
       Reg->RootKey = RootKey;
    }
    //---------------------------------------------------------------------------
    
    // HIER GILT DAS GLEICHE WIE OBEN
    void template<class T> CRegValue<T>::Set(T val)
    {
       Reg->OpenKey(Key, true);
       switch( Type )
       {
          case vtStr:
             Reg->WriteString(Value, val);
          case vtDWORD:
             Reg->WriteInteger(Value, (int)val);
       }
       Reg->CloseKey();
    }
    //---------------------------------------------------------------------------
    
    // HIER EBENFALLS DAS GLEICHE, NUR DASS ICH HIER NICHT T
    // BENUTZEN DARF ANSTATT VON void.
    T template<class T> CRegValue<T>::Get()
    {
       T val;
       Reg->OpenKey(Key, false);
       switch( Type )
       {
          case vtStr:
             val = Reg->ReadString(Value);
          case vtDWORD:
             val = (DWORD)Reg->ReadInteger(Value);
       }
       Reg->CloseKey();
    
       return val;
    }
    


  • versuch mal:

    template<class T> void CRegValue<T>::Activate(TRegistry* reg) {
    ...
    }

    template <class T> void CRegValue<T>::Set(T val) {
    ...
    }

    template<class T> T CRegValue<T>::Get() {
    ...
    }



  • Danke. Geht super. Scheiß Syntax aber auch. 😉


Anmelden zum Antworten