wie nehme ich einen funktor entgegen???



  • Uh, den mem_fun.h Header. (nein, das heißt nicht memory fun 😉 )

    Und hier gibt's sogar noch coole Beispiele, einfach mal durch die Doku durchschauen: http://libsigc.sourceforge.net/libsigc2/docs/reference/html/group__mem__fun.html#_details

    Hier noch ein Tutorial:
    http://libsigc.sourceforge.net/libsigc2/docs/manual/html/index.html

    MfG

    GPC



  • Ähm... ich muss gestehen ich habs nicht gefunden...
    Ich habe beim G++ mal `pkg-config --cflags --libs sigc++-2.0` dazu geschrieben... soweitsogut. Das funktioniert... aber ich bekomme die Meldung:

    error: ‘sigc::mem_functor’ has not been declared
    

    obwohl ich

    #include "sigc++/sigc++.h"
    #include "sigc++/signal.h"
    #include "sigc++/functors/functors.h"
    #include "sigc++/functors/mem_fun.h"
    #include "sigc++/functors/functor_trait.h"
    #include "sigc++/functors/ptr_fun.h"
    #include "sigc++/functors/slot.h"
    #include "sigc++/functors/slot_base.h"
    

    Aber anstatt alles auszuprobieren... frag ich doch nochmals nach... was ich den importieren muss.

    Danke schon mal.

    MFG



  • Hast du den Ersten von mir geposteten Link gelesen? Wenn ja, wüsstest du, dass es sigc::mem_functor nicht gibt (daher auch die Fehlermeldung)! Es gibt sigc::mem_functor0, sigc::mem_functor1 usw.
    Eben Funktoren für Methoden mit keinem Parameter, mit 1 Parameter usw.

    Und dann klappt's auch mit den includes.



  • Juuuuchu

    jetzt klappt alles, auser wenn ich diese funktoren in einem vector "speichern" will.
    also wenn ich die Zeile schreibe:

    std::vector<sigc::mem_functor0<void, void>& > callVector;
    

    aber auch in der Variante

    std::vector<sigc::mem_functor0<void, void> > callVector;
    

    tut sich nicht viel... wie "speichert" man solche Dinger?

    Boxi



  • Was heißt "klappt nicht"?



  • also die Fehlermeldung ist sehr... sehr lang... ich poste hier mal die ersten paar Zeilen, da in diesen ja meist der Hund begraben ist.

    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h: In instantiation of ‘__gnu_cxx::new_allocator<sigc::mem_functor0<void, void>&>’:
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/allocator.h:83: instantiated from ‘std::allocator<sigc::mem_functor0<void, void>&>’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:78: instantiated from ‘std::_Vector_base<sigc::mem_functor0<void, void>&, std::allocator<sigc::mem_functor0<void, void>&> >’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:159: instantiated from ‘std::vector<sigc::mem_functor0<void, void>&, std::allocator<sigc::mem_functor0<void, void>&> >’
    src/pd/observer/event.h:22: instantiated from here
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h:55: error: forming pointer to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h:56: error: forming pointer to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h:57: error: forming reference to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h:58: error: forming reference to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h:75: error: forming pointer to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h:78: error: forming pointer to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h:83: error: forming pointer to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h:93: error: forming pointer to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h:103: error: forming reference to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h:107: error: forming pointer to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/allocator.h: In instantiation of ‘std::allocator<sigc::mem_functor0<void, void>&>’:
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:78: instantiated from ‘std::_Vector_base<sigc::mem_functor0<void, void>&, std::allocator<sigc::mem_functor0<void, void>&> >’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:159: instantiated from ‘std::vector<sigc::mem_functor0<void, void>&, std::allocator<sigc::mem_functor0<void, void>&> >’
    src/pd/observer/event.h:22: instantiated from here



  • boxi schrieb:

    also die Fehlermeldung ist sehr... sehr lang... ich poste hier mal die ersten paar Zeilen, da in diesen ja meist der Hund begraben ist.

    Ich glaube, du solltest lieber das Ende dieser Liste posten 😉 (diese "instantiated from" Meldungen zeigen alle Zwischenschritte der Template-Auflösung - und am Ende davon steht dann hoffentlich auch, WAS falsch war)



  • Die "forming X to reference type" lassen darauf schliessen dass dass die vector<mem_functor<...>&> Variante war. Ein Vektor von Referenzen funktioniert aber nicht.

    Poste mal die Fehlermeldung bei der zweiten Variante (ohne das &)...



  • nimm boost::function



  • ok so kann man sich täuschen 😮
    Hier kommt die ganze Meldung:

    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h: In instantiation of ‘__gnu_cxx::new_allocator<sigc::mem_functor0<void, void>&>’:
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/allocator.h:83: instantiated from ‘std::allocator<sigc::mem_functor0<void, void>&>’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:78: instantiated from ‘std::_Vector_base<sigc::mem_functor0<void, void>&, std::allocator<sigc::mem_functor0<void, void>&> >’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:159: instantiated from ‘std::vector<sigc::mem_functor0<void, void>&, std::allocator<sigc::mem_functor0<void, void>&> >’
    src/pd/observer/event.h:22: instantiated from here
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h:55: error: forming pointer to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h:56: error: forming pointer to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h:57: error: forming reference to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h:58: error: forming reference to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h:75: error: forming pointer to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h:78: error: forming pointer to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h:83: error: forming pointer to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h:93: error: forming pointer to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h:103: error: forming reference to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h:107: error: forming pointer to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/allocator.h: In instantiation of ‘std::allocator<sigc::mem_functor0<void, void>&>’:
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:78: instantiated from ‘std::_Vector_base<sigc::mem_functor0<void, void>&, std::allocator<sigc::mem_functor0<void, void>&> >’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:159: instantiated from ‘std::vector<sigc::mem_functor0<void, void>&, std::allocator<sigc::mem_functor0<void, void>&> >’
    src/pd/observer/event.h:22: instantiated from here
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/allocator.h:87: error: forming pointer to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/allocator.h:88: error: forming pointer to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/allocator.h:89: error: forming reference to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/allocator.h:90: error: forming reference to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h: In instantiation of ‘std::_Vector_base<sigc::mem_functor0<void, void>&, std::allocator<sigc::mem_functor0<void, void>&> >::_Vector_impl’:
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:123: instantiated from ‘std::_Vector_base<sigc::mem_functor0<void, void>&, std::allocator<sigc::mem_functor0<void, void>&> >’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:159: instantiated from ‘std::vector<sigc::mem_functor0<void, void>&, std::allocator<sigc::mem_functor0<void, void>&> >’
    src/pd/observer/event.h:22: instantiated from here
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:83: error: forming pointer to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:84: error: forming pointer to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:85: error: forming pointer to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h: In instantiation of ‘std::_Vector_base<sigc::mem_functor0<void, void>&, std::allocator<sigc::mem_functor0<void, void>&> >’:
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:159: instantiated from ‘std::vector<sigc::mem_functor0<void, void>&, std::allocator<sigc::mem_functor0<void, void>&> >’
    src/pd/observer/event.h:22: instantiated from here
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:126: error: forming pointer to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:130: error: forming pointer to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h: In instantiation of ‘std::vector<sigc::mem_functor0<void, void>&, std::allocator<sigc::mem_functor0<void, void>&> >’:
    src/pd/observer/event.h:22: instantiated from here
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:190: error: no members matching ‘std::_Vector_base<sigc::mem_functor0<void, void>&, std::allocator<sigc::mem_functor0<void, void>&> >::_M_allocate’ in ‘struct std::_Vector_base<sigc::mem_functor0<void, void>&, std::allocator<sigc::mem_functor0<void, void>&> >’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:191: error: no members matching ‘std::_Vector_base<sigc::mem_functor0<void, void>&, std::allocator<sigc::mem_functor0<void, void>&> >::_M_deallocate’ in ‘struct std::_Vector_base<sigc::mem_functor0<void, void>&, std::allocator<sigc::mem_functor0<void, void>&> >’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:215: error: forming reference to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:298: error: forming reference to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:602: error: forming reference to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:657: error: forming reference to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/vector.tcc:171: error: forming reference to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/vector.tcc:311: error: forming reference to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/vector.tcc:249: error: forming reference to reference type ‘sigc::mem_functor0<void, void>&’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h: In destructor ‘std::vector<_Tp, _Alloc>::~vector() [with _Tp = sigc::mem_functor0<void, void>&, _Alloc = std::allocator<sigc::mem_functor0<void, void>&>]’:
    src/pd/observer/event.cpp:9: instantiated from here
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:272: error: ‘struct std::_Vector_base<sigc::mem_functor0<void, void>&, std::allocator<sigc::mem_functor0<void, void>&> >::_Vector_impl’ has no member named ‘_M_start’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:272: error: ‘struct std::_Vector_base<sigc::mem_functor0<void, void>&, std::allocator<sigc::mem_functor0<void, void>&> >::_Vector_impl’ has no member named ‘_M_finish’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h: In destructor ‘std::_Vector_base<_Tp, _Alloc>::~_Vector_base() [with _Tp = sigc::mem_functor0<void, void>&, _Alloc = std::allocator<sigc::mem_functor0<void, void>&>]’:
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:203: instantiated from ‘std::vector<_Tp, _Alloc>::vector(const _Alloc&) [with _Tp = sigc::mem_functor0<void, void>&, _Alloc = std::allocator<sigc::mem_functor0<void, void>&>]’
    src/pd/observer/event.cpp:9: instantiated from here
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:119: error: ‘struct std::_Vector_base<sigc::mem_functor0<void, void>&, std::allocator<sigc::mem_functor0<void, void>&> >::_Vector_impl’ has no member named ‘_M_start’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:119: error: ‘struct std::_Vector_base<sigc::mem_functor0<void, void>&, std::allocator<sigc::mem_functor0<void, void>&> >::_Vector_impl’ has no member named ‘_M_start’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:119: error: ‘struct std::_Vector_base<sigc::mem_functor0<void, void>&, std::allocator<sigc::mem_functor0<void, void>&> >::_Vector_impl’ has no member named ‘_M_end_of_storage’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:119: error: ‘_M_deallocate’ was not declared in this scope
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h: In constructor ‘std::_Vector_base<_Tp, _Alloc>::_Vector_impl::_Vector_impl(const typename _Alloc::rebind<_Tp>::other&) [with _Tp = sigc::mem_functor0<void, void>&, _Alloc = std::allocator<sigc::mem_functor0<void, void>&>]’:
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:107: instantiated from ‘std::_Vector_base<_Tp, _Alloc>::_Vector_base(const _Alloc&) [with _Tp = sigc::mem_functor0<void, void>&, _Alloc = std::allocator<sigc::mem_functor0<void, void>&>]’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:203: instantiated from ‘std::vector<_Tp, _Alloc>::vector(const _Alloc&) [with _Tp = sigc::mem_functor0<void, void>&, _Alloc = std::allocator<sigc::mem_functor0<void, void>&>]’
    src/pd/observer/event.cpp:9: instantiated from here
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:87: error: using invalid field ‘std::_Vector_base<_Tp, _Alloc>::_Vector_impl::_M_start’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:87: error: using invalid field ‘std::_Vector_base<_Tp, _Alloc>::_Vector_impl::_M_finish’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:87: error: using invalid field ‘std::_Vector_base<_Tp, _Alloc>::_Vector_impl::_M_end_of_storage’
    make: *** [src/pd/observer/event.o] Fehler 1



  • Aha. Und zu welcher Variante gehört der Fehler jetzt? Mit oder ohne Referenz im Vector?



  • der Fehler oben kommt von

    std::vector<sigc::mem_functor0<void, void>& > callVector;
    

    ohne den &:

    /usr/include/sigc++-2.0/sigc++/functors/mem_fun.h: In instantiation of ‘sigc::mem_functor0<void, void>’:
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:119: instantiated from ‘std::_Vector_base<_Tp, _Alloc>::~_Vector_base() [with _Tp = sigc::mem_functor0<void, void>, _Alloc = std::allocator<sigc::mem_functor0<void, void> >]’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:203: instantiated from ‘std::vector<_Tp, _Alloc>::vector(const _Alloc&) [with _Tp = sigc::mem_functor0<void, void>, _Alloc = std::allocator<sigc::mem_functor0<void, void> >]’
    src/pd/observer/event.cpp:9: instantiated from here
    /usr/include/sigc++-2.0/sigc++/functors/mem_fun.h:80: error: creating pointer to member function of non-class type ‘void’
    /usr/include/sigc++-2.0/sigc++/functors/mem_fun.h:89: error: creating pointer to member function of non-class type ‘void’
    /usr/include/sigc++-2.0/sigc++/functors/mem_fun.h:102: error: forming reference to void
    /usr/include/sigc++-2.0/sigc++/functors/mem_fun.h:106: error: creating pointer to member function of non-class type ‘void’
    make: *** [src/pd/observer/event.o] Fehler 1



  • Ah, ich bin doch ein Depp, mach mal das:

    std::vector< sigc::slot<void, void> > callbacks;
    


  • knapp daneben:

    std::vector< sigc::slot0<void> > callbacks;
    

    so klappts...

    Dake Jungs & Mädels (war eine dabei 😕 ) Ihr habt mich echt gerettet.

    Grüsse

    Boxi



  • boxi schrieb:

    knapp daneben:

    std::vector< sigc::slot0<void> > callbacks;
    

    so klappts...

    klaro, gleiche Geschichte wie am Anfang halt 😉

    Dake Jungs & Mädels (war eine dabei 😕 )

    Ne, aber ich fühl mich immer sehr feminin :p 🤡


Anmelden zum Antworten