我已经尝试了一周了解如何使用std :: unordered_map和自定义哈希函数。经过大量的研究,我试图为glm :: ivec3实现自己的哈希函数。我的问题是我有某种语法错误。我不知道我做错了什么,但这可能是我遗漏的东西。这是我的标题代码:
namespace mctest3
{
class ChunkMap
{
public:
struct KeyHasher
{
std::size_t operator()(const glm::ivec3& key) const
{
using std::size_t;
using std::hash;
return ((key.x * 5209) ^ (key.y * 1811)) ^ (key.z * 7297);
}
};
std::unordered_map<glm::ivec3, Chunk, KeyHasher> chunks;
ChunkMap();
Chunk* GetChunkFromPos(const glm::vec3 &pos) const;
glm::ivec3 GetChunkPosFromPos(const glm::vec3 &pos) const;
};
}
这是我的错误功能,我需要从unordered_map中检索一个值(或创建一个):
namespace mctest3
{
ChunkMap::ChunkMap()
{
}
Chunk* ChunkMap::GetChunkFromPos(const glm::vec3 &pos) const
{
glm::ivec3 ipos = glm::ivec3((int)pos.x >> Chunk::BIT_SIZE, (int)pos.y >> Chunk::BIT_SIZE, (int)pos.z >> Chunk::BIT_SIZE);
Chunk* result = chunks[ipos]; // Bug here
return result;
}
}
这是我得到的两个错误:
ChunkMap.cpp|12|error: passing 'const std::unordered_map<glm::detail::tvec3<int, (glm::precision)0u>, mctest3::Chunk, mctest3::ChunkMap::KeyHasher>' as 'this' argument of 'std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::mapped_type& std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::operator[](const _Key&) [with _Key = glm::detail::tvec3<int, (glm::precision)0u>; _Pair = std::pair<const glm::detail::tvec3<int, (glm::precision)0u>, mctest3::Chunk>; _Hashtable =|
ChunkMap.cpp|12|error: cannot convert 'std::__detail::_Map_base<glm::detail::tvec3<int, (glm::precision)0u>, std::pair<const glm::detail::tvec3<int, (glm::precision)0u>, mctest3::Chunk>, std::_Select1st<std::pair<const glm::detail::tvec3<int, (glm::precision)0u>, mctest3::Chunk> >, true, std::_Hashtable<glm::detail::tvec3<int, (glm::precision)0u>, std::pair<const glm::detail::tvec3<int, (glm::precision)0u>, mctest3::Chunk>, std::allocator<std::pair<const glm::detail::tvec3<int, (glm::precision)0u>, mctest3::Chunk> >, std:|
答案 0 :(得分:1)
问题1
Chunk* result = chunks[ipos]; // Bug here
在上面一行中,您尝试将chunks[ipos]
Chunk
类型分配给result
Chunk*
类型。
问题2
调用std::unordered_map<...>::operator[]
时,例如chunks[ipos]
,键(ipos
)的值将默认构建除非已经存在这样的钥匙。
换句话说,这样的操作可能会更改使用它的容器。
由于成员函数 GetChunkFromPos 被标记为const
,因此您不能修改类的任何成员,并且编译器会引发诊断在你面前 - 告诉你代码是不正确的。