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.cpp
    

    die 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 NULL
    

    Dass 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


Anmelden zum Antworten