Visual Studio对unordered_set模板类型推导错误?求解原因与解决方法
问题解答
原因分析
C++中的typedef(包括using别名)只是给现有类型起了一个新名字,并没有创建新的类型。你的ChunkHash本质上就是ItemUID,两者是完全等价的类型。所以Visual Studio的智能提示会显示底层的原始类型hash<ItemUID>——因为对编译器来说,ChunkHash和ItemUID没有任何区别。
你说得没错,为同一类型创建多个typedef是完全合法的,但它只是别名,不是独立类型。
解决方法
如果想让ChunkHash被视为独立的键类型,从而让unordered_set使用hash<ChunkHash>,你需要把它定义成一个新的结构体/类,而不是typedef:
1. 定义独立的ChunkHash类型
// 假设ItemUID是uint64_t或其他基础类型 using ItemUID = uint64_t; struct ChunkHash { ItemUID value; // unordered_set需要相等比较运算符来判断元素是否重复 bool operator==(const ChunkHash& other) const noexcept { return value == other.value; } };
2. 特化std::hash模板
为了让unordered_set能正确计算ChunkHash的哈希值,需要在std命名空间下特化hash模板:
#include <functional> namespace std { template<> struct hash<ChunkHash> { size_t operator()(const ChunkHash& chunk_hash) const noexcept { // 复用ItemUID的哈希实现逻辑 return hash<ItemUID>()(chunk_hash.value); } }; }
3. 使用unordered_set
现在你可以正常使用unordered_set<ChunkHash>,编译器和VS的智能提示都会识别它的键类型是ChunkHash,对应的哈希器是hash<ChunkHash>。
内容的提问来源于stack exchange,提问作者Dan Bechard
相关产品推荐
相关产品推荐

