You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用discregrids LRUCache与glm::vec3配合时遭遇binary '<'运算符未找到错误的求助

解决LRUCache中glm::vec3作为std::map键的运算符重载问题

你遇到的核心问题是std::map在比较键时会以const限定的对象进行操作,再加上C++的ADL(依赖于参数的查找)规则限制,导致你定义的operator<没有被正确匹配到。下面是具体的排查和解决步骤:

1. 修复运算符重载的命名空间问题

你的operator<签名本身是正确的,但如果这个重载定义在你自己的命名空间里,而glm::vec3属于glm命名空间,那么std::map在查找比较运算符时,ADL机制无法找到你的重载。

解决方法:把这个运算符重载放到glm命名空间中,让ADL能正确识别:

namespace glm {
bool operator<(const glm::vec3& lhs, const glm::vec3& rhs) { 
    return lhs.x < rhs.x || (lhs.x == rhs.x && (lhs.y < rhs.y || (lhs.y == rhs.y && lhs.z < rhs.z))); 
}
} // namespace glm

2. 给std::map指定自定义比较器(无需修改命名空间)

如果不想侵入glm命名空间,可以在LRUCache的std::map定义里显式指定自定义比较逻辑:
首先定义一个比较结构体:

struct Vec3Less {
    bool operator()(const glm::vec3& lhs, const glm::vec3& rhs) const {
        return lhs.x < rhs.x || (lhs.x == rhs.x && (lhs.y < rhs.y || (lhs.y == rhs.y && lhs.z < rhs.z)));
    }
};

然后修改LRUCache中的key_to_value_type定义:

using key_to_value_type = std::map<key_type, std::pair<value_type, typename key_tracker_type::iterator>, Vec3Less>;

这样std::map就会直接使用你定义的Vec3Less来比较glm::vec3键,不再依赖全局的operator<。

3. 快速验证方法

可以先写一段极简代码测试你的比较逻辑是否能被std::map识别:

#include <map>
#include <glm/glm.hpp>

// 这里放你的operator<重载(注意命名空间)
bool operator<(const glm::vec3& lhs, const glm::vec3& rhs) { 
    return lhs.x < rhs.x || (lhs.x == rhs.x && (lhs.y < rhs.y || (lhs.y == rhs.y && lhs.z < rhs.z))); 
}

int main() {
    std::map<glm::vec3, int> testMap;
    testMap[{1,2,3}] = 42;
    return 0;
}

如果这段代码编译失败,说明你的operator<确实没有被正确匹配,这时就优先用前面两种方法解决即可。

内容的提问来源于stack exchange,提问作者user18029267

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 19:54:07