Нет соответствующего универсального делегата как лямбда-параметра в классе наследования - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь использовать делегатов в своем проекте, но, кодируя все глубже и глубже, я сталкиваюсь с каким-то странным поведением.

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

template<typename T>
class Slave{
    public:
    typedef void (*F)(T option);

    Slave<T>::F f;

    Slave(Slave<T>::F *f){
        this->f = f;
    }
};

template<typename T>
class Master {
    public:
    T option;
    Slave<T>* slave;

    Master(T option, Slave<T>* slave){
        this->option = option;
        this->slave = slave;
    }
    void blink(){
        slave->f(option);
    }
};

void loop(){
    Master<int> *m;
    m = new Master<int>(3, new Slave<int>([](int option) -> void {
        //blink option times
    })); // Here error: no matching function for call to 'Slave<int>::Slave(Core::Core()::<lambda(int)>)'
    m->blink();
};

1 Ответ

3 голосов
/ 07 июня 2019

Проблема в том, что Slave<T>::F уже является указателем.

Slave(Slave<T>::F *f){
    this->f = f;
}

Ваш параметр является указателем на указатель на функцию. Просто измените это на:

Slave(Slave<T>::F f){
    this->f = f;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...