Std::function<>出错的问题,非常困扰,请帮助我

在3.2rc0的版本时,为了将子场景的数据回传给主场景。我在跳转场景时
auto index=(towerMenu*)scene->getChildren().at(0);
index->getre=CC_CALLBACK_1(TDScene::readVelue,this);
这样将主场景函数readVelue()与子场景函数getre()绑定。子场景中用std::function<void(int)> getre;声明。
如此在子场景中能执行主场景的函数实现数据交互。

在3.4版本中我如法炮制了这个方法却报错,今天试了3.5也不行。我怕是我写错了,于是拿以前3.2顺利运行的代码在3.5里面跑发现依然出错。
错误位置是在子场景中执行getre函数时发生强制中断
错误信息是
Unhandled exception at at 0x758D969B in te1.exe: Microsoft C++ exception: std::bad_function_call at memory location 0x001BF1A0.
在functional文件的515行处强制中断
_VARIADIC_EXPAND_P1_1(_CLASS_FUNC_CLASS_1, , , , )

我已经不知道怎么办了,请帮帮我。
如果有别的方法也可以告诉我。我的目的是点击主场景弹出子场景(我这里是在主场景上再加了个图层),根据在子场景里的动作主场景显示不同的精灵。

不能沉啊,帮我出出主意

在执行getre这个函数的时候,是不是它是已经赋值了的。。。
因为我看你是用的scene->getChildren().at(0);这个获取的,不一定是你index->getre=CC_CALLBACK_1(TDScene::readVelue,this) 这个的节点,可能你2次操作的不是同一个节点里面的getre

感谢回复。
我觉得应该不会,因为我只有1个towerMenu类型的实例,我贴一下上下文
void TDScene::choseT() {
auto scene = towerMenu::create();
scene->setPosition(Vec2(ori.x+pos.x60,ori.y+pos.y60));
auto index=(towerMenu*)scene->getChildren().at(0);
index->getre=CC_CALLBACK_1(TDScene::readVelue,this);
this->addChild(scene,100);}
感觉好像不会出现2个包含getre的节点。也可能是我误解了你的意思。

最令我想不通的是3.2上能跑的代码在3.4和3.5也会出错,所以我觉得是机制改动造成的。可能是引擎采用了新的办法或者真的是脑抽了把原来好好的东西搞砸了,要么不支持vs2012了?求大神堵住我的脑洞……

auto index=(towerMenu*)scene->getChildren().at(0); 你把这个节点设置一个tag,看赋值这个index->getre的index和 你调用的index是不是同一个地址

你可以这样打印 log("%p",index)

怎么弄?对不起我不太明白,我调用的index是哪个?

auto index=(towerMenu*)scene->getChildren().at(0);
然后 index->setTag(233);
这样吗?
然后 index->getre=CC_CALLBACK_1(TDScene::readVelue,this);
log("%p",index) ;
这个顺序吗?都写在一起?

不是,是这样:

index->getre=CC_CALLBACK_1(TDScene::readVelue,this);此时打印下index

后面当你调用这个getre函数的时候,再打印下index, 看这2个值是不是同一个

首先,我试了一下,log("%p",index);输出的并不是tag
log(“1.tag=%p”,index); //06DA8C98
log(“2.tag=%p”,index->getTag()); //FFFFFFFF
index->setTag(233);
log(“3.tag=%p”,index); //06DA8C98
log(“4.tag=%p”,index->getTag()); //000000E9

在子场景调用的时候是这样的:
void towerMenu::back()
{
getre(rev);
this->removeFromParent();
}
index这个变量在这里是不存在的

你不要这么死板,我是描述问题,就是怕你给另外一个节点赋值getre,但是当你调用这个函数的节点,又不是你赋值的那个

留下你qq,

不好意思,但是我不知道怎么处理了:904:
qq我私信给你好了

根本没发给我,我刚看了,没收到

又发了,你看一下

问题解决了,非常感谢您的解答

楼主,我也和你一样,用3.4,VS2012,我在用function写回调时没参数的函数回调成功,但是不能成功编译带参数的函数,如果你解决了问题能不能帮我看看
typedef std::function<void(DirectionMessage)> ControllerCallBack;//我把函数指针重命名了

protected:
ControllerCallBack PickOrAttackCallFunc;
ControllerCallBack MoveCallFunc;//我把回调函数作为成员使用

MoveCallFunc = std::bind(&ControllerLayer::move, this, std::placeholders::_1);
PickOrAttackCallFunc = std::bind(&ControllerLayer::pickOrAttack, this, std::placeholders::_1);//初始化的时候添加绑定

然后编译报错:
\xrefwrap(283): error C2064: 项不会计算为接受 1 个参数的函数