Ableiten eines class templates



  • ...Hier stand viel Text(Forensoftware lässt grüßen)...

    Ich habe folgendes Problem:

    Ich möchte ganz gerne vom ptr_vector der boost Bibl. eine Klasse ableiten(wobei es denek ich für das Problem unerheblich ist ob ich nun den std::vector oder boost::vector verwenden würde), damit ich eine Memberfunktion einbauen kann die mir das löschen eines Pointer über den Wert des Pointers selber und nicht über den Index/Iterator erlaubt.

    Das ableiten selber ging zunächst ohne Probleme. Aber die neue Funktion will irgendwie nicht laufen.

    template<typename T>
    class CDynArray : public boost::ptr_vector<T>
    {
    public:
    	template <class C>
    	void Delete( C* );
    
    };
    
    template <typename T, class C>
    void CDynArray<T>::Delete( C* )
    {
    }
    

    der Compiler schmeißt mir hierbei den Interessanten Fehler entgegen:

    1>...\dynarray.cpp(14) : error C2244: 'CDynArray<T>::Delete': Keine Übereinstimmung für Funktionsdefinition mit vorhandener Deklaration gefunden
    1>        Definition
    1>        'void CDynArray<T>::Delete(C *)'
    1>        Vorhandene Deklarationen
    1>        'void CDynArray<T>::Delete(C *)'
    

    Ich gebe zu ich habe bisher nicht viel Ahnung von C++(bin Anfänger in C++, habe lange Delphi geproggt(hätte eigentlich in dem Text oben stehen der nicht mehr da ist)). Der Gedanke hinter Templates ist mir ansich klar nur den Syntax durchblicke ich nicht so ganz.
    D.h. wie sollte die Klassenableitung mit neuer Funktion am besten aussehen so dass sie auch funktioniert. Weiter ist mir sehr schleierhaft wie mir die Fehlermeldung weiterhelfen sollte um das ganze syntaktisch richtig aufzuschreiben(ich vermute mal das der Fehler ganz wo anders liegt und ich bereits in der Klassendef nen Fehelr gemacht habe) 🙄



  • FunMaker schrieb:

    Ich möchte ganz gerne vom ptr_vector der boost Bibl. eine Klasse ableiten(wobei es denek ich für das Problem unerheblich ist ob ich nun den std::vector oder boost::vector verwenden würde), damit ich eine Memberfunktion einbauen ...

    Davon würde ich dir unabhängig von dem Fehler abraten. Es sei den du bist dir sicher das diese Klasse wirklich als Basisklasse geeignet ist (z.B. ist std::vector es IMHO nicht).

    Vielleicht ist eine Templatefunktion die als Argument den vector und den Zeiger übernimmt für dein Einsatz besser geeiget.



  • template <typename T> 
    template <typename C>
    void CDynArray<T>::Delete( C* )
    {
    }
    

    Wenn dein Delete keine Member-Tempate wäre, dann wäre es implizit nur ein template <typename T>, so wie alle deine Member-Funktionen auch. Man muss es halt nur nicht hinschreiben.

    Wenn es aber selbst auch nochmal ein template ist, musst du halt zweimal template hinschreiben ...


Anmelden zum Antworten