错误:无效使用void表达式,C ++

时间:2013-12-15 17:13:36

标签: c++

我正在尝试为学校项目实现一个菜单系统,其中我有一个包含

形式的函数指针的STL Map
    map<string, YMenu>

当我尝试从YMenu中调用一个成员函数来通过map向向量添加一个新的函数指针时,我得到一个错误,说它是“无效使用void表达式”。我已在下面附上相关代码。

持有数组的向量:

    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()来编译和运行。

3 个答案:

答案 0 :(得分: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 :(得分:1)

不使用C风格的函数指针,而是使用std::functionstd::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"]));

答案 2 :(得分:1)

Menues["0.1"].show()的类型不是函数指针。它是在特定对象上调用show()的结果。看来,您的show()函数会返回int。尝试将函数推入任何形状或形式的void(*)()时,您将没有多大乐趣!

你可能正在寻找的是std::function<void()>,它可用于调用一个nullary函数对象,即可以在没有参数的情况下调用的东西。您想要传递的函数似乎是一个成员函数,因此它实际上有一个参数,即隐式传递的this指针。您还想忽略std::function<void()>很乐意为您做的返回类型。也就是说,您的nextAction向量将被声明为

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

但是,要实际使用正确的对象添加show函数,您还需要构造一个套装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>