Как создать очередь, которая будет содержать указатель на функцию? - PullRequest
0 голосов
/ 22 декабря 2018

Я пытаюсь создать очередь, которая может получить указатель на функцию - и я не могу найти, как это сделать

это мой код

        struct TaskElement
    {
        int id;
        std::function<void()> func;

        void operator()()
        {
            func();
        }
    };

    int main()
    {

        MyMath* myMathElement = new MyMath();

        myMathElement->Print_1();

        Queue<TaskElement> myQueue;


        TaskElement t1;
        t1.id = 1;
        t1.func = myMathElement->Print_1;

        TaskElement t2;
        t2.id = 2;
        t2.func = &myMathElement->Print_2;


        myQueue.push(t1);     Error !!! &': illegal operation on bound member function expression
        myQueue.push(t2);     Error !!! &': illegal operation on bound member function expression

        auto rec1 = myQueue.pop();

        rec1();



        std::cin.get();
    }

1 Ответ

0 голосов
/ 22 декабря 2018

Нестатические функции-члены нуждаются в вызове объекта.Используя обычный myMathElement->Print_1, вы не предоставляете никакой объект, просто указатель на функцию-член.

Либо используйте std::bind, чтобы предоставить объект в качестве первого аргумента функции:

t1.func = std::bind(&MyMath::Print_1, myMathElement);

Или используйте лямбда-выражения :

t1.func = [myMathElement]() { myMathElement->Print_1(); };

Что касается ваших ошибок, либо вы их получаете из-за какой-то проблемы в Queue class (который вы нам не показали), но, скорее всего, ошибки связаны не с вызовами push, а с назначениями func участника.

Вы должны получить их отназначение, потому что они не являются действительными назначениями.Вы не можете использовать такие функции-члены, вы должны использовать оператор адреса & и полную область видимости с классом (или структурой) вместо объекта.Как показано выше при вызове std::bind, вы должны использовать &MyMath::Print_1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...