以下向量声明:
vector<string> valid_escape = {'n', 't', 'r', '0', '\\'};
导致错误:
<块引用>error: could not convert ‘{'n', 't', 'r', '0', '\\'}’ from ‘<brace-enclosed initializer list>’ to ‘std::vector<std::__cxx11::basic_string<char> >’
关于此问题的其他 SO 帖子得出的结论是,这是 4.7 版 gcc 中的一个错误,或者编译中未提及 -std=c++11
标志。
我的 gcc 版本是 7.3.0,我用上面的标志编译。
出于好奇和狭隘的希望,我尝试将 vector
替换为 list
,但遇到了类似的错误。
答案 0 :(得分:4)
如果您需要使用由这些字符组成的单个 std::vector
初始化 std::string
的 std::string
,则需要额外的大括号初始化器:
vector<string> valid_escape = {{'n', 't', 'r', '0', '\\'}};
内大括号将用给定的字符初始化一个字符串,外大括号将使用索引为 0 的字符串构造一个向量。
如果您想要一个包含多个 std::vector
的 std::string
,每个都用一个字符初始化,您需要:
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)
答案 1 :(得分:2)
std::string
对象初始化为双 "
(双引号),如 "string"
而不是双 '
(单引号),如 'n'
试试这个:
std::vector<std::string> valid_escape = {"n", "t", "r", "0", "\\"};
答案 2 :(得分:1)
您可以使用字符串作为字符的容器:
std::string valid_escape = {'n', 't', 'r', '0', '\\'};