У меня go при создании рендерера minecraft. При загрузке мира из файлов региона он сохраняет проанализированные данные NBT на неупорядоченной карте с данными nbt в качестве значения и глобальными координатами блока в качестве ключа. В частности, unordered_map<pair<int, int>, CompoundTag*>
(составной тег является данными NBT)
Однако я столкнулся с ошибкой времени компиляции, которая, кажется, указывает на неупорядоченную карту. Это выглядит следующим образом.
Ошибка LNK2001 неразрешенный внешний символ "class std :: unordered_map, struct Chunk, struct std :: ha sh>, struct std :: equal_to>, class std :: распределитель const, struct Chunk>>> __cdecl createChunks (класс std :: unordered_map, класс CompoundTag, struct std :: ha sh>, struct std :: equal_to>, класс std :: allocator const, класс CompoundTag>>> & , class Asset &) "(? createChunks @@ YA? AV? $unordered_map@U?$pair@HH@std@@UChunk@@U? $hash@U?$pair@HH@std@@@2@U? $equal_to@U?$pair@HH@std@@@2@V? $allocator@U? $ pair @ $$ CBU? $pair@HH@std@@UChunk@@@std@@@2@@std@@AEAV? $unordered_map@U?$pair@HH@std@@VCompoundTag@@U? $hash@U?$pair@HH@std@@@2@U? $equal_to@U?$pair@HH@std@@@2@V? $allocator@U? $ pair @ $$ CBU? $pair@HH@std@@VCompoundTag@@@std@@@2@@2@AEAVAsset@@@Z)
Я решил неразрешенные внешние проблемы раньше, и обычно это потому, что я забыл включить внешний файл (отсюда и название), который нужен программе. Однако на этот раз я почти уверен, что у меня есть все необходимое. Я включил unordered_map в начало файла. Я включил заголовок, в котором определен Chunk, и я знаю о необходимости пользовательской сборки ha sh и функций equal_to, и предоставил им следующее в включаемом файле заголовка.
namespace std
{
template<>
struct hash<pair<int32_t, int32_t>>
{
size_t operator ()(const pair<int32_t, int32_t>& value) const
{
uint64_t key = ((uint64_t)value.first) << 32 | (uint64_t)value.second;
key ^= (key >> 33);
key *= 0xff51afd7ed558ccd;
key ^= (key >> 33);
key *= 0xc4ceb9fe1a85ec53;
key ^= (key >> 33);
return (size_t)key;
}
};
template<>
struct equal_to<pair<int32_t, int32_t>>
{
bool operator ()(const pair<int32_t, int32_t>& v1, const pair<int32_t, int32_t>& v2) const
{
return (v1.first == v2.first) && (v1.second == v2.second);
}
};
}
Единственное, что, как я думал, мне может понадобиться, - это предоставить собственный распределитель? Но все, что я нашел об использовании пар в качестве ключей в unordered_maps, говорит о том, что в этом нет необходимости. Я немного озадачен и буду благодарен за любую информацию. Если у вас есть вопросы или вы хотите увидеть больше кода, пожалуйста, задавайте их. Это на моем github , если вы хотите взглянуть на проект в целом, но если вы (справедливо) не хотите разбираться во всем этом беспорядке, просто попросите разъяснений по чему-либо или дополнительной информации.
Edit 1, я как мог разобрал ошибку.
class std::unordered_map
<
struct std::pair
<
int,
int
>,
struct Chunk *,
struct std::hash
<
struct std::pair
<
int,
int
>
>,
struct std::equal_to
<
struct std::pair
<
int,
int
>
>,
class std::allocator
<
struct std::pair
<
struct std::pair
<
int,int
> const,
struct Chunk *
>
>
>
__cdecl createChunks(
class std::unordered_map
<
struct std::pair
<
int,
int
>,
class CompoundTag *,
struct std::hash
<
struct std::pair
<
int,
int
>
>,
struct std::equal_to
<
struct std::pair
<
int,
int
>
>,
class std::allocator
<
struct std::pair
<
struct std::pair
<
int,
int
> const,
class CompoundTag *
>
>
>&
,class Asset&
)
(?createChunks@@YA?AV?$unordered_map@U?$pair@HH@std@@PEAUChunk@@U?$hash@U?$pair@HH@std@@@2@U?$equal_to@U?$pair@HH@std@@@2@V?$allocator@U?$pair@$$CBU?$pair@HH@std@@PEAUChunk@@@std@@@2@@std@@AEAV?$unordered_map@U?$pair@HH@std@@PEAVCompoundTag@@U?$hash@U?$pair@HH@std@@@2@U?$equal_to@U?$pair@HH@std@@@2@V?$allocator@U?$pair@$$CBU?$pair@HH@std@@PEAVCompoundTag@@@std@@@2@@2@AEAVAsset@@@Z) MCRenderer C:\Users\noahm\source\repos\noahwhygodwhy\MCRenderer\MCRenderer\MCRenderer.obj 1