【问题标题】:Initializing std::map in a call to a class constructor在调用类构造函数时初始化 std::map
【发布时间】:2016-12-29 11:15:33
【问题描述】:

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

【问题讨论】:

  • @tkausl 我明白了,嗯,我要仔细检查我的代码。
  • 你用的是什么编译器?
  • @BiagioFesta sudo g++-4.8 *.cpp -o "main" -pthread -std=c++1y -Wall -pedantic-errors; 但这不是问题,我已经更新了我的问题。

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


【解决方案1】:

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

这听起来像 most vexing parse problem

确实在您的代码中:

Input  _Input(
  std::map<std::string, void(*)(void)> {
  // -----------------------------------^
      {"exit", [](){exit(1);}}
    }
 );

Input _Input(...) 可以解释为函数定义,因此,按照标准,编译器可以。

该论点因错误而得到加强:

error: expected ‘)’ before ‘{’ token

那是因为编译器需要 ) 来关闭函数的签名。

正如您已经发现的,一种解决方案是使用统一初始化语法。 那是因为代码不再模棱两可了。


对于一个没有人能够回答的合法问题,投了很多反对票。

我同意你的观点,只是为了改善问题本身,否决票应该意味着评论。

无论如何,我希望您能找到有用的答案。

【讨论】:

  • 确实,似乎就是这样。谢谢你:)
【解决方案2】:
  1. 解决方案是使用新的统一初始化语法而不是旧的对象初始化。不知道为什么,也许有人可以澄清一下。

  2. 对于一个没有人能够回答的合法问题,投了很多票。

【讨论】:

    猜你喜欢
    • 2017-05-02
    • 2016-02-16
    • 2017-05-31
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 2015-02-02
    • 2013-10-14
    • 1970-01-01
    相关资源
    最近更新 更多