указатель функции обратного вызова Bind в качестве параметра - PullRequest
1 голос
/ 22 ноября 2011

Я пытаюсь передать указатель на функцию, используя boost :: bind.

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))
        );
}

Я получаю следующие ошибки:

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 &)'

Однако мне удалось перейти на следующее, все работает нормально:

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))
        );
}

ПочемуЯ получаю эти ошибки, если я объявляю метод в классе Class?

Ответы [ 2 ]

3 голосов
/ 22 ноября 2011

Когда вы связываете нестатическую функцию-член, вам нужно предоставить указатель this, который будет использоваться. Если вы не хотите, чтобы функция была связана с конкретным экземпляром Class, вы должны сделать функцию статической.

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.
2 голосов
/ 22 ноября 2011

Потому что вам нужно также связать экземпляр Class.Прочитайте документацию Boost .

Я думаю вам нужно это:

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

Примечание: фрагмент кода выше находится на моей голове,Я думаю, что это правильно, хотя.

...