Template-Klasse erweitern
-
Hallo,
ich möchte die Klasse XSNamedMap des Xerces-C XML-Parsers erweitern. Für die Erweiterung habe ich folgende Klasse zum testen geschrieben:
XSNamedMapExt.h
#include <iterator> template<typename T> class XSNamedMapExt : public XSNamedMap { public: Iterator begin(); Iterator end(); };und XSNamedMapExt.cpp
#include "XSNamedMapExt.h" template<typename T> Iterator XSNamedMapExt<T>::begin() { return NULL; } template<typename T> Iterator XSNamedMapExt<T>::end() { return NULL; }Versuche ich nun mit
g++ XSNamedMapExt.cppdie Klasse zu compilieren kommen mehrere Fehler.
zco@ppc201:~/c/a10$ g++ XSNamedMapExt.cpp In file included from XSNamedMapExt.cpp:1: XSNamedMapExt.h:5: error: Fehler beim Parsen before `{' token XSNamedMapExt.h:10: error: Fehler beim Parsen before `)' token XSNamedMapExt.cpp:6: error: Syntaxfehler before `<' token XSNamedMapExt.cpp:6: error: `T' was not declared in this scope XSNamedMapExt.cpp:6: error: template argument 1 is invalid XSNamedMapExt.cpp:7: error: ISO C++ forbids declaration of `begin' with no type XSNamedMapExt.cpp: In function `int begin()': XSNamedMapExt.cpp:8: Warnung: converting to non-pointer type `int' from NULL XSNamedMapExt.cpp: At global scope: XSNamedMapExt.cpp:12: error: Syntaxfehler before `<' token XSNamedMapExt.cpp:12: error: `T' was not declared in this scope XSNamedMapExt.cpp:12: error: template argument 1 is invalid XSNamedMapExt.cpp:13: error: ISO C++ forbids declaration of `end' with no type XSNamedMapExt.cpp: In function `int end()': XSNamedMapExt.cpp:14: Warnung: converting to non-pointer type `int' from NULLDass selbst bei so einer minimalen Erweiterung schon solche Fehler kommen hatte ich nicht unbedingt gedacht.
Ich hoffe ihr könnt mir helfen,
Gruß

-
Die erweiterte Klasse ist ein Template. Demnach soltest Du alles - also auch die Implementierung der Methoden - in die H-Datei schreiben. In Deinem Fall am besten inline. Also:
#include <iterator> // #include für XSNamedMap fehlt. template<typename T> class XSNamedMapExt : public XSNamedMap< T > // steht XSNamedMap nicht im namespace !? { public: Iterator begin() { return NULL; } Iterator end() { return NULL; } };Im Übrigen dürfte Iterator als Typ unbekannt sein; oder?
Gruß
Werner