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

时间:2018-10-03 15:12:49

标签: c++ c++11

当我尝试调用以下构造函数时,将其传递给静态成员函数不会收到任何错误,但是当我将其传递给非静态成员函数时则会出现编译错误:

构造函数

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
  • 在Google各处搜索以获取有关编译错误的有用信息。

1 个答案:

答案 0 :(得分:1)

您向后调用bind,它首先获取可调用对象(在这种情况下为成员函数的指针),然后再获取参数。

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

但是,查看Timer的构造函数,您应该能够传递这些参数,因为它们仍然受到约束:

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