不废话,发个C,c++回调的问题,大家帮看看

wokagoka 2012-08-24 11:19:44
main.cpp:34: 错误:不能从 ‘boost::_bi::bind_t<void, boost::_mfi::mf0<void, TestCase>, boost::_bi::list1<boost::_bi::value<TestCase*> > >’ 转换到 ‘void (*)()’,为实参 ‘2’(属于 ‘void Fun(int, void (*)())’)


#include <stdio.h>
#include <sys/wait.h>
#include "boost/date_time/posix_time/posix_time.hpp"
#include "boost/bind.hpp"
#include "boost/functional.hpp"

using namespace std;
using namespace boost;
using namespace boost::posix_time;

typedef void (*Callback)();


void Fun(int x, Callback cb)
{
cout << x << endl;
cb();
}
void RealCallback()
{
cout << "Real Call Back" << endl;
}

class TestCase
{
public:
void TCCallback()
{
cout << "TC Call Back" << endl;
}

void Run()
{
Fun(5,boost::bind(&TestCase::TCCallback, this));
}
};


int main(int argc, const char *argv[])
{

TestCase tc;
tc.Run();
return 0;
}
...全文
271 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
herman~~ 2012-08-25
  • 打赏
  • 举报
回复
既然是不能修改的接口,那就别用boost的bind方法
自己定义static 类静态函数调用
template_cplus 2012-08-25
  • 打赏
  • 举报
回复
http://www.codeproject.com/KB/atl/atl_underthehood_5.aspx
上面发错了 不过也是相关的这个 比较接近
template_cplus 2012-08-25
  • 打赏
  • 举报
回复
我没用过boost 不过看LZ的代码 我给2种方法
假如你仅仅想实现你代码中所表达的
你可以
static void TCCallback()
{
cout << "TC Call Back" << endl;
}

void Run()
{
Fun(5,TCCallback);
}
如果你想用非静态成员,那要复杂点需要thunk 我最近正好在看ATL thunk方面的东西,发现boost的做法很相似
参考地址http://www.codeproject.com/Articles/25198/Generic-Thunk-with-5-combinations-of-Calling-Conve
template_cplus 2012-08-25
  • 打赏
  • 举报
回复
我没用过boost 不过看LZ的代码 我给2种方法
假如你仅仅想实现你代码中所表达的
你可以
static void TCCallback()
{
cout << "TC Call Back" << endl;
}

void Run()
{
Fun(5,TCCallback);
}
如果你想用非静态成员,那要复杂点需要thunk 我最近正好在看ATL thunk方面的东西,发现boost的做法很相似
参考地址http://www.codeproject.com/Articles/25198/Generic-Thunk-with-5-combinations-of-Calling-Conve
wokagoka 2012-08-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

在function/bind中使用如下的回调定义方式:
C/C++ code

boost::function<void()> f = boost::bind(&TestCase::TCCallback, this);



C/C++ code

typedef void (*Callback)(); \\这个是函数指针方式,别混淆了
[/Quote]
不是混淆,这是别人给的接口,只能这么用,有办法吗?
wokagoka 2012-08-24
  • 打赏
  • 举报
回复
这个是别人给我的C接口,不能换的。。。[Quote=引用 1 楼 的回复:]

不废话

把你的 typedef void (*Callback)();
换成

typedef boost::function<void()> Callback;
[/Quote]
wokagoka 2012-08-24
  • 打赏
  • 举报
回复
这个是别人给我的C接口,不能换的。。。[Quote=引用 1 楼 的回复:]

不废话

把你的 typedef void (*Callback)();
换成

typedef boost::function<void()> Callback;
[/Quote]
Coder_Y_Jao 2012-08-24
  • 打赏
  • 举报
回复
另外,新标准中加入了对这个的支持,不必使用整个boost
Coder_Y_Jao 2012-08-24
  • 打赏
  • 举报
回复
在function/bind中使用如下的回调定义方式:

boost::function<void()> f = boost::bind(&TestCase::TCCallback, this);



typedef void (*Callback)(); \\这个是函数指针方式,别混淆了
Occam's_Razor 2012-08-24
  • 打赏
  • 举报
回复
不废话

把你的 typedef void (*Callback)();
换成

typedef boost::function<void()> Callback;
Coder_Y_Jao 2012-08-24
  • 打赏
  • 举报
回复
顺便说下,看你TestCase的命名,应该是个unit test,
如果是的话,那么接口应当以满足这个TestCase为目的,而不应当修改TestCase。
如果你这个TestCase是随便写的就当我没说。
Coder_Y_Jao 2012-08-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
不是混淆,这是别人给的接口,只能这么用,有办法吗?
[/Quote]

那就别用function/bind, 因为他的接口不支持,那就改TestCase吧

一:

class TestCase
{
public:
static void TCCallback()
{
cout << "TC Call Back" << endl;
}

void Run()
{
Fun(5, TCCallback);
}
};


二:


class TestCase
{
public:
void Run()
{
Fun(5, RealCallback);
}
};
wokagoka 2012-08-24
  • 打赏
  • 举报
回复
函数指针和成员函数指针的区别,百度之
franzhong 2012-08-24
  • 打赏
  • 举报
回复
参数类型不匹配啊
zealass 2012-08-24
  • 打赏
  • 举报
回复
boost::function<void()> CallbackObj;
zealass 2012-08-24
  • 打赏
  • 举报
回复

typedef boost::function<void()> CallbackObj;
void CallbackFuc()
{
CallbackObj();
}

CallbackObj= boost::bind(...);
Callback = CallbackFuc;

65,189

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧