【问题标题】:binary '<': no operator found which takes a left-hand operand of type 'const _Ty' glm::vec3 in map二进制 \'<\': 未找到在 map 中采用 \'const _Ty\' glm::vec3 类型的左操作数的运算符
【发布时间】:2022-08-17 22:27:11
【问题描述】:

我一直在涉足discregrids LRUCache,但我无法让它与glm\'s vec3\'s 一起工作。我不断收到binary \'&lt;\': no operator found which takes a left-hand operand of type \'const _Ty\' 错误,即使我已经为底层 std:map [文件.hpp]:

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);
}

template <typename K, typename V>
class LRUCache
{
    using key_type = K;
    using value_type = V;

    using key_tracker_type = std::list<key_type>;
    using key_to_value_type = std::map<key_type, std::pair<value_type, typename key_tracker_type::iterator>>;
    ...
}
LRUCache<glm::vec3, double>
  • 我假设第 3 行正在生成错误?编译器告诉你 glm::vec3.y 类让我们称之为 Foo 没有函数 bool operator<((maybe const) Foo& other)
  • 不相关:比较功能看起来关闭。 vec3 是否应该仅仅因为它的位置而被认为比另一个少?
  • 从我所看到的情况来看,这取决于目的,这是我在 SO 上找到的答案之一,所以我就顺其自然了。
  • 如果目的是能够将vec3s 存储在地图中,请使用unordered_map 并实现散列函数。这应该可以让你避免以后出现一些奇怪的结果。
  • 好吧,我正在将 Discregrid 用于 SDF 生成,这是在那里使用很多的类之一。我宁愿只能够创建一个运算符重载,而不必重写库的一半。

标签: c++ dictionary caching key glm-math


【解决方案1】:

简短的形式是由于 ADL 的工作方式,找不到您的 operator&lt;。特别是,C++ 搜索参数(及其基类和其他相关类)的名称空间。您已将 operator&lt; 放在全局命名空间中,而不是 glm 命名空间。

因此,您可以将比较放在 glm 命名空间中(我不建议这样做),或者创建一个比较函数对象并使用它。

struct MyCompare{
  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);
  }
};

然后使用它

std::map<key_type, std::pair<value_type, typename key_tracker_type::iterator>, MyCompare>

不想下单的也可以看unordered_map,能不能开发出合理的哈希函数(或者自带)。

【讨论】:

    猜你喜欢
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多