boost bind callback Funktionszeiger als Parameter

  • Ich versuche, einen Funktionszeiger mit boost :: bind zu übergeben.

     void
    Class::ThreadFunction(Type(*callbackFunc)(message_type::ptr&))
    {
    }
    
    boost::shared_ptr<boost::thread>
    Class::Init(Type(*callbackFunc)(message_type::ptr&))
    {
        return boost::shared_ptr<boost::thread> (
            new boost::thread(boost::bind(&Class::ThreadFunction, callbackFunc))
            );
    }
     

    Ich erhalte folgende Fehler:

     1>C:\dev\sapphire\boost_1_46_1\boost/bind/mem_fn.hpp(362) : warning C4180: qualifier applied to function type has no meaning; ignored
    1>C:\dev\sapphire\boost_1_46_1\boost/bind/mem_fn.hpp(333) : error C2296: '->*' : illegal, left operand has type 'Type (__cdecl **)(message_type::ptr &)'
     

    Allerdings konnte ich Folgendes ändern, es funktioniert gut:

     void
    ThreadFunction(Type(*callbackFunc)(message_type::ptr&))
    {
    }
    
    boost::shared_ptr<boost::thread>
    Class::Init(Type(*callbackFunc)(message_type::ptr&))
    {
        return boost::shared_ptr<boost::thread> (
            new boost::thread(boost::bind(&ThreadFunction, callbackFunc))
            );
    }
     

    Warum erhalte ich diese Fehler, wenn ich die Methode in der Class-Klasse deklariere?

    22 November 2011
    Takashi
2 answers
  • Wenn Sie eine nicht statische Memberfunktion binden, müssen Sie den Zeiger this angeben, der verwendet wird. Wenn Sie nicht möchten, dass die Funktion einer bestimmten Instanz von Class zugeordnet wird, sollten Sie die Funktion statisch machen.

     struct Class {
        void foo(int) { }
        static void bar(int) { }
    };
    
    std::bind(&Class::foo, 5); // Illegal, what instance of Class is foo being called
                               // on?
    
    Class myClass;
    std::bind(&Class::foo, &myClass, 5); // Legal, foo is being called on myClass.
    
    std::bind(&Class::bar, 5); // Legal, bar is static, so no this pointer is needed.
     
    22 November 2011
    Collin Dauphinee
  • Weil Sie auch eine Instanz von Class binden müssen. Lesen Sie die Boost-Dokumentation .

    Ich denke , Sie brauchen Folgendes:

     boost::thread(boost::bind(
        &Class::ThreadFunction, &someClassInstance, _1), 
        callbackFunc);
     

    Hinweis: Das obige Code-Snippet befindet sich nicht in meinem Kopf. Ich denke jedoch, dass es richtig ist.

    22 November 2011
    Anthonyuser1400532