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.