Template auf boost::function



  • Ich will ein Template auf boost::function erstellen.
    So:

    #include <iostream>
    #include <boost/function.hpp>
    
    class X
    {
    public:
        void Func ( int x ) { std::cout << x << std::endl ; }
    };
    
    int main()
    {
        template<class T>
        boost::function<void(T*,int)> MyFunc ;
        MyFunc = &T::Func ;
        X x ;
        MyFunc(&x,2) ;
    }
    

    Fehler:

    In function ‘int main()’:|
    error: expected primary-expression before ‘template’|
    error: expected ‘;’ before ‘template’|
    error: ‘MyFunc’ was not declared in this scope|
    error: ‘T’ has not been declared|
    ||=== Build finished: 4 errors, 0 warnings ===|
    


  • nami schrieb:

    Ich will ein Template auf boost::function erstellen.

    Du willst was? Den Terminus "Template auf XY erstellen" gibts nicht.

    Du kannst entweder ein Klassentemplate oder ein Funktionstemplate deklarieren oder definieren.

    - Klassentemplates werden deklariert nach dem schema

    template <[templatemparameter]>
    class|struct Name;
    

    , bei der Definition kommt noch die Liste der Basisklassen und der Definitionsrumpf (Geschweifte Klammern mit Membern, typedefs, Methoden, friends, zugriffsspezifizierern usw.) hinzu.

    - Funktionstemplates werden deklariert nach dem Schema

    template <[templateparameter]>
    [Rückgabetyp] FunktionsName([Argumentliste]);
    

    , bei der Definition entfällt das Semikolon und es folgt der Funktionsrumpf (Geschweifte Klammern mit Ausdrücken)
    Funktionstemplates dürfen außerdem wie alle Funktionen nicht innerhalb von anderen Funktionsdefinitionen definiert werden.

    Fürs Klassentemplate fehlt also zumindest das schlüsselwort class oder struct, ein funktionstemplate kann an der Stelle nicht definiert werden und es fehlen so oder so die Klammern für die Argumentliste.

    Also nochmal von vorne: was willst du erreichen, was ist deine Idee, wie du es evtl. erreichen könntest. Bitte in klaren Worten die jeder versteht und wenn möglich etwas mehr als ein halber Satz.
    Siehe auch Link in meiner Signatur.



  • nami schrieb:

    :

    template<class T>
        boost::function<void(T*,int)> MyFunc ;
        MyFunc = &T::Func ;
        X x ;
        MyFunc(&x,2) ;
    

    Du musst MyFunc schon einen richtigen Typen geben. ZB so:

    boost::function<void(X*,int)> MyFunc = &X::Func;
        X x;
        MyFunc(&x,2);
    

    Was willst Du denn hier durch ein template<class T> erreichen?



  • Willst Du vielleicht so etwas hier?

    using boost::function;
      using boost::bind;
      using boost::_1;
    
      X x;
      function<void(int)> myfunc = bind(&X::Func, &x, _1);
      myfunc(2);
    

    Hier hängt der Typ von myfunc nicht von X ab.


Anmelden zum Antworten