使用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
相关产品推荐
相关产品推荐

