问题描述
以下向量声明:
vector<string> valid_escape = {'n','t','r','0','\\'};
导致错误:
error: Could not convert ‘{'n','\\'}’ 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
,但遇到了类似的错误。
解决方法
如果您需要使用由这些字符组成的单个 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)
,
std::string
对象初始化为双 "
(双引号),如 "string"
而不是双 '
(单引号),如 'n'
试试这个:
std::vector<std::string> valid_escape = {"n","t","r","0","\\"};
,
您可以使用字符串作为字符的容器:
std::string valid_escape = {'n','\\'};