【问题标题】:How to solve the array initialization issue with visual studio 2013如何使用 Visual Studio 2013 解决数组初始化问题
【发布时间】:2015-03-30 20:19:00
【问题描述】:

我想将一个数组声明为 Struct 的成员之一。失败,编译器抛出如下错误:

error C2536: ... : cannot specify explicit initializer for arrays

这是我在 .h 文件中的结构:

struct CommandRepo
{
    std::string root_command[5] = { "create", "edit", "remove", "list", "setting" };
    std::string Base = "^(create|edit|remove|settings|list)(?: *)(?:--([a-zA-Z]*))";
    std::string EachWord = "(\\w+)";
};

似乎(如在 SO 中某处所读),VSC2013 并不完全符合 C++11,并且该错误与缺乏合规性有关。真的吗?我该如何解决?

【问题讨论】:

  • 在 Visual Studio 齐心协力之前,您必须在构造函数中以老式的方式进行操作。或者,如果它永远不会改变,您可以将其设为静态常量。
  • 你可以试试 Visual Studio 2015 Preview。

标签: c++ visual-studio c++11 visual-studio-2013


【解决方案1】:

是否可以使用std::vector?如:

struct CommandRepo
{
    std::vector<std::string> root_command = { "create", "edit", "remove", "list", "setting" };
    std::string Base = "^(create|edit|remove|settings|list)(?: *)(?:--([a-zA-Z]*))";
    std::string EachWord = "(\\w+)";
};

这个结构的接口肯定会改变,但这让您可以初始化std::strings 的列表。

【讨论】:

  • 嗯,确实有可能。但是由于容器的大小是明确的并且是固定的,所以数组是一个更优雅的选择。
  • @MostafaTalebi std::array&lt;std::string, 5&gt; 怎么样?
  • 如果常规数组不起作用,是什么让您认为更复杂的东西会起作用?
  • 如果您担心vector 的不当使用,那么您可以为其添加const 修饰符。这样,所有改变vector 大小的操作都会被编译器捕获。目前没有可以使用的固定大小的 STL 构造,而且您的编译器不喜欢数组,所以这似乎是一个合理的折衷方案。
  • @NeilKirk,确实如此。由于这是一个编译器支持的问题,我有理由问vector 是否适用于 OP。 vector 更复杂并不一定意味着编译器不支持它。 OP 在他的第一条评论中指出,这在他的编译器上是可能的,但它不符合他的设计要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 2015-11-28
  • 1970-01-01
相关资源
最近更新 更多