为什么传递非静态成员函数会导致编译错误?

Why does passing a non-static member function cause compilation errors?

本文关键字:编译 错误 函数 静态成员 为什么      更新时间:2023-10-16

当我尝试调用以下构造函数时,传递给它一个静态成员函数,我没有收到任何错误,但是当我传递给它一个非静态成员函数时,我得到一个编译错误:

构造 函数

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
  • 谷歌搜索有关编译错误的有用信息。

你对向后bind调用,它首先获取可调用对象(在本例中为指向成员函数的指针(,然后是参数。

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

但是,查看构造函数Timer您应该能够传递这些参数,因为它们无论如何都会被绑定:

Timer timer(252222, duration_type::milliseconds, true,
&MotionAnalyser::ObjectGarbageCollector, this);