我遇到了typedef / call back函数的问题。
typedef void (*timer_cb_fn_t)(void); //defined in timer.h
这是timer.cpp
中定义的timer_start函数的定义unsigned int TimClass:: timer_start(unsigned int interval, timer_cb_fn_t cb)
{
//do stuff
}
dpl.h包含timer.h
我正在尝试从dpl.cpp文件调用计时器功能 其中回调函数定义为
void Dpl::receive_timeout(void)
{
receive_state = STATE_IDLE;
}
我正在使用以下调用调用函数timer start。
unsigned int receive_timer = timer_start(TIMER_FRAME_TIME_MS, receive_timeout);
g ++编译器抛出以下错误。
./src/dpl/dpl.cc:138:107: error: no matching function for call to ‘TimClass::timer_start(unsigned int, <unresolved overloaded function type>)’
../dpl.cc:138:107: note: candidate is:
../timer.h:256:16: note: unsigned int TimClass::timer_start(unsigned int, timer_cb_fn_t)
../timer.h:256:16: note: no known conversion for argument 2 from ‘<unresolved overloaded function type>’ to ‘timer_cb_fn_t {aka void (*)()}’
make: *** [build/dpl.o] Error 1
您能解释一下如何解决这个问题吗?
答案 0 :(得分:3)
Dpl::receive_timeout
的类型为void (Dpl::*)(void)
,它采用隐式this
参数。使您的函数保持静态(我认为您不能这样做,因为您似乎使用非静态类成员)或更改您的计时器定义以接受任何仿函数并传递lambda / std::function<void(void)>
。
静态回调:
// function declaration
class Dpl{
// ...
static receive_timeout(void);
// ...
};
// function definition
void Dpl::receive_timeout(void)
{
receive_state = STATE_IDLE;
}
拉姆达:
template<typename T>
unsigned int TimClass:: timer_start(unsigned int interval, T&& callback)
{
//do stuff
}
std::function
:(注意:使用类型擦除,这在运行时更昂贵)
unsigned int TimClass:: timer_start(unsigned int interval, std::function<void(void)> const& callback)
{
//do stuff
}
顺便说一句,如果你想获取一个成员函数的地址,你需要使用限定名称和operator&
:
&Dpl::receive_timeout