定义地图<ivec3, my_custom_class*>

define map<ivec3, my_custom_class*>

我正在尝试定义一个具有键 glm::ivec3 和值 Chunk* 的映射,它是我创建的 class:

Main.cpp 看起来像这样:

#include <map>
#include <Chunk.h>

std::map<glm::ivec3, Chunk*> chunks;

Chunk.h 看起来像这样:

class Chunk {
public:

    Chunk(glm::mat4 transform, glm::ivec3 position) :
        transform(transform), position(position)
    {
        glGenVertexArrays(1, &VAO);
        glGenBuffers(1, &VBO);
        glGenBuffers(1, &EBO);
    }


    Chunk(int x, int y) : _x(x), _y(y) {}
    ~Chunk() {}

    bool operator<(const Chunk& other) const {
        return (_x < other._x) || (!(other._x < _x) && (_y < other._y));
    }

    // ...

private:
    int _x, _y;
    unsigned int VBO, VAO, EBO;

    // ...
};

但我一直收到这个错误`:

binary '<': 'const _Ty' does not define this operator or a conversion to a type acceptable to the predefined operator

我该如何解决这个问题?感谢您的宝贵时间!

文档:https://en.cppreference.com/w/cpp/container/map

std::map is a sorted associative container that contains key-value pairs with unique keys. Keys are sorted by using the comparison function Compare

如果您不提供 Compare 函数(用于比较键,因此对键进行排序以便可以通过地图代码快速找到确定的键)那么通常的(或重载)[=使用 11=]。

碰巧 glm::ivec3 没有实现 '<' 重载,然后编译器报错。

您可以自己使用 class,派生自 glm::ivec3,实现了 < 比较器。或者将您自己的 Compare 提供给 std::map ctor。

这里 https://en.cppreference.com/w/cpp/container/map/map 你有一个示例,其中 class 'PointCmp' 用作“比较”参数。