 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Ronny Spiegel Guest
|
Posted: Thu Apr 21, 2005 7:07 pm Post subject: Template-Klassen und Überschreiben von Methoden |
|
|
Hi @ll,
ich hoffe, ich bin hier richtig, wenn nicht, lasse ich mich gern belehren :)
Ich habe mal wieder ein Problem mit Template-Klassen. Ziel ist es, zwei
Stringklassen (ISO und UTF8 (mit wchar_t)) auf die gleiche technische
Basis zu stellen. Daher soll es eine Klasse BasicString geben.
(Beispiel unten - stark vereinfacht !!)
Um z.B. festzustellen, ob ein Character lowercase ist, gibt es für char
und wchar verschiedene Funktionen, also soll die Implementation solche
Datentypabhängigen Funktionen der abgeleiteten Klasse überlassen werden.
( --> im Beispiel: T toLowerCase(const T s) )
Weiterhin gibt es aber auch eine gleichnamige Funktion
BasicString& toLowerCase(), die eigentlich sofort implementiert werden
kann, sie benutzt nur die abstrakte Funktion toLowerCase(const T).
Wenn ich das ganze aber compiliere, meint mein Compiler:
templ.cc:49: error: no matching function for call to `String::toLowerCase()'
templ.cc:43: error: candidates are: virtual char String::toLowerCase(char)
Aber die Klasse String erbt doch das Interface von BasicString<T> und
dort ist eben die toLowerCase() definiert ???
Könntet Ihr mir vielleicht 'nen kurzen Tipp geben, was mein Problem ist ?
Viele Grüsse,
Ronny
---snip ---
#include <cstdio>
#include <malloc.h>
#include <cstdlib>
#include <cstring>
#include <ctype.h>
template<typename T> class BasicString {
public:
BasicString<T>( const T* src )
{
_buf = (T*) malloc( sizeof(T) * 10 );
memcpy( _buf, src,sizeof(T) * 10 );
}
virtual ~BasicString()
{
printf( "buffer freedn" );
free( _buf );
}
BasicString& toLowerCase()
{
for(int i = 0;i < 10;i++)
_buf[i] = toLowerCase(_buf[i]);
return *this;
}
protected:
T* _buf;
virtual T toLowerCase( const T s ) = 0;
};
class String : public BasicString
{
public:
String( const char* src ) : BasicString<char>( src ) { }
~String() { }
protected:
char toLowerCase( const char s ) { return tolower( s ); }
};
int main()
{
String s("123456789");
toLowerCase();
return 0;
}
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Thu Apr 21, 2005 11:00 pm Post subject: Re: Template-Klassen und Überschreiben von Methoden |
|
|
Ronny Spiegel wrote:
| Quote: | Hi @ll,
ich hoffe, ich bin hier richtig, wenn nicht, lasse ich mich gern belehren
:)
Ich habe mal wieder ein Problem mit Template-Klassen. Ziel ist es, zwei
Stringklassen (ISO und UTF8 (mit wchar_t)) auf die gleiche technische
Basis zu stellen. Daher soll es eine Klasse BasicString geben.
(Beispiel unten - stark vereinfacht !!)
Um z.B. festzustellen, ob ein Character lowercase ist, gibt es für char
und wchar verschiedene Funktionen, also soll die Implementation solche
Datentypabhängigen Funktionen der abgeleiteten Klasse überlassen werden.
( --> im Beispiel: T toLowerCase(const T s) )
Weiterhin gibt es aber auch eine gleichnamige Funktion
BasicString& toLowerCase(), die eigentlich sofort implementiert werden
kann, sie benutzt nur die abstrakte Funktion toLowerCase(const T).
Wenn ich das ganze aber compiliere, meint mein Compiler:
templ.cc:49: error: no matching function for call to
`String::toLowerCase()' templ.cc:43: error: candidates are: virtual char
String::toLowerCase(char)
Aber die Klasse String erbt doch das Interface von BasicString<T> und
dort ist eben die toLowerCase() definiert ???
Könntet Ihr mir vielleicht 'nen kurzen Tipp geben, was mein Problem ist ?
|
Das hat eigentlich gar nichts mit Templates zu tun. Wenn du in einer
abgeleiteten Klasse eine Funktion definierst, verdeckt diese alle
Funktionen mit gleichem Namen in der Basisklasse.
Um sie auch in der abgeleiteten Klasse sichtbar zu machen, müßtest du sowas
wie:
using BasicString<char>::toLowerCase;
dort einfügen.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|