nochmal method pointer



  • also, ich habe ne klasse

    template<class IndexBuffer,class VertexBuffer> 
    class Buffer:public IBuffer{
    //...
    };
    

    in der implementation von Buffer habe ich folgende hilfsfunktion:

    template<class T>
    void for_each_list_entry(void (T::*method)()){
                    std::list<std::list<IBuffer*> >::const_iterator outer_list;
                    std::list<IBuffer*>::const_iterator inner_list;
                    for(outer_list=Tree.begin();outer_list!=Tree.end();++outer_list){
                        for(inner_list=outer_list->begin();inner_list!=outer_list->end();++inner_list){
                            ((*inner_list)->*method)();
                        }
                    }
                }
    

    rufe ich die funktion nun so auf:

    for_each_list_entry(&Buffer::deleteTree);
    

    erhalte ich den fehler:

    [C++ Error] DirectXBuffer.h(177): E2319 'Buffer<IndexData<Effect::Effekt>,VertexData>' is not a public base class of 'IBuffer'
    

    aber buffer is ja abgeleitet.
    was hab ich falsch gemacht?



  • otze schrieb:

    also, ich habe ne klasse

    template<class IndexBuffer,class VertexBuffer> 
    Buffer:public IBuffer{
    //...
    };
    

    class fehlt vor Buffer



  • wurde ausversehen beim kopieren rausgeschnitten, existiert aber^^



  • die Template-Parameter fehlen auch:

    for_each_list_entry(&Buffer<IndexDataEffect::Effekt,VertexData>::deleteTree); 🙄



  • klappt immernoch nich, immernoch gleicher fehler^^

    //edit
    also der fehler tritt genau in dieser zeile auf:

    ((*inner_list)->*method)();
    

    wenn ich als parameter IBuffer::deleteTree aufrufe gelingts ganz ohne probleme...



  • Welches Templateargument übergibst du denn der Funktion?

    Wenns IBuffer ist, ist deleteTree auch in IBuffer vorhanden?

    Wenn nicht is klar das es nicht geht.

    mfg



  • Dann musst du die Methode über das Buffer Objekt aufrufen. Falls deleteTree in IBuffer deklariert und virtual ist, musst du die Adresse von IBuffer::deleteTree beim Aufruf von for_each_list_entry anbegen.



  • Durchs edit is mein Coment schwachsinn, schade 😞



  • @shlo meinst du anlegen?Dann weis ich nämlich nciht, was du meinst^^

    mir ist noch was aufgefallen:
    ich rufe die klasse einmal so auf:

    Buffer::IBuffer* a= new Buffer::Buffer<Buffer::IndexDataEffect::Effekt,Buffer::VertexData>();

    was mir aufgefallen ist, ist dass alle bereichsbezeichner entfernt werden, ausser Effect:: ist das der fehler, oder ist das ganz normal?^^



  • Ein neues Objekt brauchst du nicht anlegen, denn dein IBuffer ist gleichzeitig auch ein Buffer. Ein Downcast, was zwar nicht sonderlich schön ist, sollte reichen. Bei Namensräumen hättest du dir andere Namen einfallen müssen, was aber nicht heißt, dass dies der Grund für den Fehler ist.



  • jo habs nu auch herausgefunden, dass automatisch downgecastet wird...wie gesagt, nicht schön, dafür aber enorm flexibel.


Anmelden zum Antworten