实例化std::unordered_map<const char, std::string>时默认构造函数被隐式删除报错
问题原因与解决方法
你遇到的问题核心是C++标准库并未为const char类型提供std::hash的特化版本。
C++标准中,std::hash仅对char、signed char、unsigned char这些非const修饰的字符类型提供了特化实现。而const char是独立于char的类型,标准库没有为它定义哈希规则,因此当unordered_map尝试使用默认的std::hash<const char>作为哈希器时,编译器找不到对应的特化,进而触发"默认构造函数被隐式删除"的错误——因为无法生成合法的哈希器实例。
解决方法
有两种简单的修复方式:
修改键类型为
char
由于const char可以隐式转换为char,直接将键类型改为char即可使用标准的std::hash<char>:std::unordered_map<char, std::string> cities = { {'A', "Amsterdam"}, {'B', "Berlin"}, {'C', "Canberra"} };自定义哈希器
如果一定要保留const char作为键类型,可以自定义哈希函数,复用std::hash<char>的实现:struct ConstCharHash { size_t operator()(const char c) const { // 将const char转换为char后使用标准哈希 return std::hash<char>()(c); } }; std::unordered_map<const char, std::string, ConstCharHash> cities = { {'A', "Amsterdam"}, {'B', "Berlin"}, {'C', "Canberra"} };
补充说明
需要注意的是,你当前代码里用的是字符字面量(比如'A'),const char作为键存储的是字符值;但如果误用字符串字面量(比如"A"),键会变成const char*,这又是另一个需要单独处理哈希的类型,要注意区分。
内容的提问来源于stack exchange,提问作者Kaiyakha
相关产品推荐
相关产品推荐

