C++11初始化std::map<char, const char[]>报错:无匹配构造函数
解决C++11中std::map列表初始化的报错问题
错误原因
编译器报错no matching constructor for initialization of 'std::map<char, char[]>'的核心原因是:std::map要求其值类型必须支持拷贝(或移动)构造,而数组类型(比如const char[])无法被拷贝,不符合容器元素的要求。虽然字符串字面量可以隐式转换为const char*,但数组类型本身不能作为map的value。
解决方案
方案1:将值类型改为const char*
把std::map<char, const char []>替换为std::map<char, const char*>,指针类型支持拷贝操作,能正常完成列表初始化:
#include <map> std::map<char, const char*> nomi = { { static_cast<char>(0), "Oggetto" }, { static_cast<char>(1), "Entity" }, { static_cast<char>(2), "Player" }, { static_cast<char>(3), "Proiettile" }, { static_cast<char>(4), "SaltoInAlto" }, { static_cast<char>(5), "SuperVelocita" }, { static_cast<char>(6), "Volo" }, { static_cast<char>(7), "Pavimento" } };
这里用static_cast<char>(0)替代C风格的(char)0,是更符合C++规范的类型转换方式。
方案2:使用std::string作为值类型(推荐)
如果后续需要对字符串进行操作,std::string是更安全、灵活的选择,它自动管理内存,完全满足map对值类型的要求:
#include <map> #include <string> std::map<char, std::string> nomi = { { static_cast<char>(0), "Oggetto" }, { static_cast<char>(1), "Entity" }, { static_cast<char>(2), "Player" }, { static_cast<char>(3), "Proiettile" }, { static_cast<char>(4), "SaltoInAlto" }, { static_cast<char>(5), "SuperVelocita" }, { static_cast<char>(6), "Volo" }, { static_cast<char>(7), "Pavimento" } };
总结
数组类型不能作为std::map的value,因为不满足容器元素的可拷贝要求。将值类型替换为const char*或std::string即可解决C++11下的列表初始化报错问题。
内容的提问来源于stack exchange,提问作者Leonardo Rosati
相关产品推荐
相关产品推荐

