C ++ Unresolved重载函数类型

时间:2016-10-05 16:26:52

标签: c++ typedef overloading

我遇到了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

您能解释一下如何解决这个问题吗?

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