在对类构造函数

时间:2016-08-22 19:35:20

标签: c++ constructor c++14 initializer-list stdmap

我已经看到了我尝试使用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

2 个答案:

答案 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)

  1. 解决方案是使用新的统一初始化语法而不是旧的对象初始化。没有想法为什么,也许有人可以澄清。

  2. 对于 nobody 能够回答的合理问题,有很多下选票。

相关问题