절차적 맵 생성 기능을 구현하면서, 격자 좌표를 기반으로 중복 지형 생성을 방지하고 좌표로 즉시 방(Room) 포인터에 접근하기 위해 TMap의 키로 FCMRoomPosition 구조체를 사용하고자 했습니다. 그러나 컴파일 단계에서 TMap 키 타입에 대한 해시 함수와 동등 비교 연산자가 없다는 오류가 발생했고, 이로 인해 빌드가 진행되지 않았습니다. 본 문서에서는 오류가 발생한 원인과 이를 해결하기 위해 적용한 코드 변경 사항을 정리했습니다.

USTRUCT()
struct FCMRoomPosition
{
GENERATED_BODY()
int32 X;
int32 Y;
FORCEINLINE FCMRoomPosition() : X(0), Y(0) {}
FORCEINLINE FCMRoomPosition(int32 InX, int32 InY) : X(InX), Y(InY) {}
FORCEINLINE bool operator==(const FCMRoomPosition& Other) const
{
return X == Other.X && Y == Other.Y;
}
};
// 전역 해시 함수
FORCEINLINE uint32 GetTypeHash(const FCMRoomPosition& Pos)
{
// 두 좌표 해시 결합
return HashCombine(::GetTypeHash(Pos.X), ::GetTypeHash(Pos.Y));
}
이번 이슈는 TMap이 요구하는 키 타입 계약(operator==, GetTypeHash)을 간과해서 발생한 문제였습니다. 사용자 정의 구조체를 컨테이너의 키로 사용하려면 비교와 해시의 정의가 반드시 필요하다는 점을 다시금 확인했습니다. 향후에는 키 타입을 설계할 때 동등성/해시의 일관성과 가시성(선언 순서)까지 함께 점검하여 유사한 빌드 오류를 사전에 방지해야겠습니다.