C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Template-Klassen und Überschreiben von Methoden

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Ronny Spiegel
Guest





PostPosted: Thu Apr 21, 2005 7:07 pm    Post subject: Template-Klassen und Überschreiben von Methoden Reply with 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 Sad ???

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





PostPosted: Thu Apr 21, 2005 11:00 pm    Post subject: Re: Template-Klassen und Überschreiben von Methoden Reply with quote



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 Sad ???

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.