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

error: invalid use of void expression, C++

本文关键字:void 表达式 C++ 无效 错误      更新时间:2023-10-16

我正试图为一个学校项目实现一个菜单系统,其中我有一个包含形式的函数指针的STL映射

    map<string, YMenu>

当我试图从YMenu中调用一个成员函数,通过映射添加一个指向向量的新函数指针时,我收到一个错误,说这是"无效使用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()进行编译和运行。

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"]));

还要注意,只有在index < nextAction.size()在此操作之前,即std::vector<T>不会自动调整大小以适应新索引的情况下,使用nextAction[index]才有效:这必须明确用于std::vector<T>

使用Menus["0.1"].show(),您正在调用函数。

您也不能像尝试的那样存储指向成员函数的指针,除非您在最终调用成员函数指针时实际拥有对象实例。我建议你研究一下std::functionstd::bind:

std::vector<std::function<void()> nextAction;
nextAction.push_back(std::bind(&YMenu::show, &Menus["0.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"]));