2013-12-15 41 views
0

我想实现的一个学校项目,在那里我有一个包含函数指针在错误:无效使用无效的表达,C++

map<string, YMenu> 

形式当我尝试调用一个STL地图的菜单系统YMenu中的一个成员函数,通过地图添加一个新的函数指针到一个向量,我得到一个错误,说它是“void expression的无效使用”。我已附上下面的相关代码。

矢量保持阵列:

vector<void (*)() > nextAction; 

功能添加函数指针:

void YMenu::addNextAction(int index, void (*Action)()) 
    { 
     nextAction[index] = Action; 
    } 

语法调用将产生的错误成员函数时使用:

Menus["0.0"].addNextAction(1, Menus["0.1"].show()); 

用于可能的任何想法解决方案?我试图找到谷歌和在这里搜索,但似乎无法找到答案。 :/

求助:谢谢你们,显然我在那里犯了一些愚蠢的错误。我终于设法实现了代码,并使用std :: function和std :: bind()来编译和运行代码。

+1

该消息对应哪一行? –

+2

'show'是什么? –

+0

应该被称为“函数指针的无效使用” –

回答

1

类型的Menues["0.1"].show()是不是一个函数指针。这是针对特定对象调用show()的结果。看来,你的show()函数返回int。尝试以任何形状或形式将功能推入void(*)(),您将没有多少乐趣!

您可能正在寻找的是std::function<void()>,它可以用来调用无函数对象,即可以不带参数调用的东西。你想传递的函数似乎是一个成员函数,因此它实际上有一个参数,隐式地通过this指针。你也想忽略std::function<void()>会很乐意为你做的返回类型。也就是说,你的nextAction载体将被宣布为

std::vector<std::function<void()> nextAction; 

然而,实际上正确的对象添加show功能,您还需要构建一个suitbale std::function<void()>对象:因为你的成员函数需要一个对象,你”将需要绑定对象的功能,例如:

Menues["0.0"].addNextAction(1, std::bind(&YMenu::show, &Menus["0.1"])); 

另外请注意,使用nextAction[index]才有效,如果index < nextAction.size()这种操作,即之前,std::vector<T>不会自动调整到适当大小,以适应新的指标:即必须是明确的std::vector<T>

1

Menus["0.1"].show()你是调用的函数。

除非您最终调用成员函数指针时实际上有对象实例,否则您也不能存储指向成员函数的指针,就像您试图执行的操作一样。我建议你看看std::functionstd::bind

std::vector<std::function<void()> nextAction; 
nextAction.push_back(std::bind(&YMenu::show, &Menus["0.1"])); 
1

而不是使用C风格的函数指针,使用std::function组合和std::bind如下:

std::vector<std::function<void()> > nextAction; 

void YMenu::addNextAction(int index, std::function<void()> Action) 
{ 
    nextAction[index] = Action; 
} 

Menus["0.0"].addNextAction(1, std::bind(&YMenu::show, &Menus["0.1"]));