【问题标题】:Could not convert from ‘<brace-enclosed initializer list>’ to vector无法从“<brace-enclosed initializer list>”转换为向量
【发布时间】:2021-04-07 10:20:02
【问题描述】:

以下向量声明:

vector<string> valid_escape = {'n', 't', 'r', '0', '\\'};  

导致错误:

error: could not convert ‘{'n', 't', 'r', '0', '\\'}’ from ‘&lt;brace-enclosed initializer list&gt;’ to ‘std::vector&lt;std::__cxx11::basic_string&lt;char&gt; &gt;’

关于这个问题的其他 SO 帖子得出的结论是,它是 4.7 版本的 gcc 中的一个错误,或者编译中没有提到 -std=c++11 标志。

我的 gcc 版本是 7.3.0,我用上面的标志编译。

出于好奇和狭隘的希望,我尝试将 vector 替换为 list 并得到了类似的错误。

【问题讨论】:

  • 'n' 是一个字符,而不是一个字符串。 "n" 是一个字符串。
  • 好的,您已经描述了您尝试编写代码时发生的事情,以及您所做的一些研究和调查的结果。但是您的问题是什么?
  • 您想要 5 个字符串,每个字符串的大小为 1?还是一个有 5 个字符的字符串?

标签: c++ vector initializer-list


【解决方案1】:

如果您需要使用由这些字符组成的单个 std::string 来初始化 std::strings 中的 std::vector,则需要一个额外的大括号初始化器:

vector<string> valid_escape = {{'n', 't', 'r', '0', '\\'}};

内大括号将使用给定字符初始化一个字符串,外大括号将在索引 0 处使用该字符串构造一个向量。

如果您想要一个包含多个 std::strings 的 std::vector,每个都使用单个字符进行初始化,您需要:

vector<string> valid_escape = {{'n'}, {'t'}, {'r'}, {'0'}, {'\\'}};

std::string 容器没有接受单个字符的构造函数,因此需要一个初始化列表。

例子:

string x = 'a';   // not possible, no constructor exists
string x = "a";   // possible, string(const char* s)
string x = {'a'}; // possible, string(initializer_list<char> il)

【讨论】:

    【解决方案2】:

    std::string 对象初始化为双 "(双引号),如 "string",而不是双 '(单引号)如 'n'

    试试这个:

    std::vector<std::string> valid_escape = {"n", "t", "r", "0", "\\"};
    

    【讨论】:

      【解决方案3】:

      您可以使用字符串作为字符的容器:

      std::string valid_escape = {'n', 't', 'r', '0', '\\'};
      

      【讨论】:

      • 或者简单地说:std::string valid_escape = "ntr0\\"; :-)
      • @Jarod42 我知道,但在接受的答案中就像vector&lt;string&gt; valid_escape = {{'n', 't', 'r', '0', '\\'}};。您可以将其替换为vector&lt;string&gt; valid_escape = {"ntr0\\"};。更多的是关于初始化字符串的不同可能性。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 2016-05-15
      • 1970-01-01
      • 2013-01-13
      • 1970-01-01
      相关资源
      最近更新 更多