错误:无效使用了void表达式C++
error: invalid use of void expression, C++
我正试图为一个学校项目实现一个菜单系统,其中我有一个包含形式的函数指针的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::function
和std::bind
:
std::vector<std::function<void()> nextAction;
nextAction.push_back(std::bind(&YMenu::show, &Menus["0.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"]));
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- (C++)分析树以计算返回错误值的简单算术表达式
- void() 是一个有效的C++表达式吗?
- 为什么新表达式可以正确生成指针类型,即使它应该返回 void*?
- 在c++std::函数的上下文中无效使用void表达式
- 无效地将 void 表达式与队列和 .pop() 一起使用
- 代数树表达式C++错误:未解析的外部符号"Public:_thiscall AlgebraicTreeExpression::~AlgebraicTreeExpression(void) ..."
- 使用多线程处理对象数组 - 无效使用 void 表达式错误
- 您可以在表达式中使用 void 返回函数吗?
- C STD ::线程无效的void表达式使用
- static_casting constexpr void* 的结果是常量表达式吗?
- 错误:无效使用了void表达式C++
- LAMBDA 错误:类型 'void' 的条件表达式是非法的
- lambda表达式中出现无效的使用Void表达式错误
- 错误:在类方法声明中无效地使用void表达式
- c++ 14是否要求delete表达式必须调用' void operator::delete(void*, std::
- 无法在VS 14 CTP中使用auto声明lambda:类型为'void'的条件表达式是非法的
- 无效地将void表达式与线程和对象一起使用
- 编译错误:无效使用了void表达式
- 可变模板:无效使用void表达式