Почему передача нестатической функции-члена вызывает ошибки компиляции? - PullRequest
0 голосов
/ 03 октября 2018

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

Конструктор

template <class callable, class... arguments>
Timer(int after, duration_type duration, bool async, callable&& f, arguments&&... args)
{

    std::function<typename std::result_of<callable(arguments...)>::type()> 
            task(std::bind(std::forward<callable>(f), std::forward<arguments>(args)...));

}

Вызов

Timer timer(252222, duration_type::milliseconds, true, &MotionAnalyser::ObjectGarbageCollector); // Does not work because it does not point to object too.

Timer timer(252222, duration_type::milliseconds, true, std::bind(this, &MotionAnalyser::ObjectGarbageCollector)); //Should work, but does not?!?!

Ошибка

Error   C2039   'type': is not a member of 'std::result_of<callable (void)>'    

Пока у меня есть:

  • Изучил, как используется std:function, который оказался в связке с вызываемым типом, вызывающий объект должен быть вызываемым типом, так как я перегрузил оператор () (основываясь на моем понимании вызываемых типов).
  • Я рассмотрел передачу нестатических функций-членов в функцию, поэтому я попытался использовать std::bind
  • Поискал для полезной информации о компиляцииошибка.

1 Ответ

0 голосов
/ 03 октября 2018

Вы обращаетесь к bind в обратном направлении, сначала он вызывает вызываемый объект (в данном случае указатель на функцию-член), а затем параметры.

std::bind(&MotionAnalyser::ObjectGarbageCollector, this)

Однако, глядя на конструктордля Timer вы должны иметь возможность передавать эти аргументы, так как они все равно связаны:

Timer timer(252222, duration_type::milliseconds, true,
            &MotionAnalyser::ObjectGarbageCollector, this);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...