我已经看到了我尝试使用void function的确切语法,但我无法弄清楚为什么它在我的代码中不起作用:
构造
class Input
{
public:
Input(const std::map<std::string, void(*)(void)> &arg_0)
{ //...code...// }
};
使用临时std :: map:
调用构造函数 Input _Input(
std::map<std::string, void(*)(void)> {
{"exit", [](){exit(1);}}
}
);
此外,只需稍加改动
std::map<std::string, void(*)(void)> NAME = {
{"exit", [](){exit(1);}
}
足以解决问题,并且出于某种原因,NAME也超出了范围(这就是我想要的)。所以基本上,我知道解决方案,但我想知道为什么第一个代码不起作用。
附:错误为
error: expected ‘)’ before ‘{’ token
IN
std::map<std::string, void(*)(void)> {
我知道,我调用构造函数的确切方式显然非常重要:
class BackEnd
{
private:
Input _Input(
std::map<std::string, void(*)(void)> {
{"exit", [](){exit(1);}}
}
);
};
在这种情况下,它会停止工作并抛出错误。 示例:https://ideone.com/ikGUGF
答案 0 :(得分:1)
解决方案是使用新的统一初始化语法而不是旧的对象初始化。不知道为什么,也许有人可以澄清。
听起来像 most vexing parse problem 。
确实在你的代码中:
Input _Input(
std::map<std::string, void(*)(void)> {
// -----------------------------------^
{"exit", [](){exit(1);}}
}
);
Input _Input(...)
可以解释为函数定义,因此,自标准以来,编译器就会这样做。
错误强化了这一论点:
error: expected ‘)’ before ‘{’ token
这&#39;因为编译器需要)
才能关闭函数的签名。
正如您已经发现的,一个解决方案在于使用统一初始化语法。 那是因为代码不再含糊不清。
对于一个没有人能够回答的合法问题,这是很多的选票。
我同意你的观点,因为为了改善问题本身,下选票应该暗示评论。
无论如何,我希望你能找到有用的答案。
答案 1 :(得分:0)
解决方案是使用新的统一初始化语法而不是旧的对象初始化。没有想法为什么,也许有人可以澄清。
对于 nobody 能够回答的合理问题,有很多下选票。