c++ - 无法重载 glm::vec2 '<' 运算符

标签 c++ operator-overloading operators overloading glm-math

我需要将 std::map 与 glm::vec2 一起使用,所以我尝试实现“<”运算符但它失败了。 ( std::map 需要这个运算符)

这是我的测试示例中的代码:

bool operator <(const glm::vec2& l, const glm::vec2& r)
{
    int lsize = l.x + l.y;
    int rsize = r.x + r.y;

    return lsize < rsize;
}


class A
{
public:
    A()
    {
        test[glm::vec2(5, 5)] = 4;
    }
private:
    std::map<glm::vec2, int> test;
};


int _tmain(int argc, _TCHAR* argv[])
{
    A a;
    return 0;
}

当我创建自己的 Vector2 类并以相同的方式实现运算符时,它会编译,但会因 glm::vec2 而失败(我有 19 个错误告诉运算符 '<' is not defined for glm::vec2 等.)

error C2676: binary '<' : 'const glm::vec2' does not define this operator or a conversion to a type acceptable to the predefined operator   

请注意,我的运算符重载函数编译时,错误来自使用 std::map,似乎 '<' glm::vec2 运算符仍被视为未定义。

如果对您有帮助,这里是 GLM 资源:https://github.com/g-truc/glm/tree/master/glm

最佳答案

让我担心的是,您甚至一开始就尝试这样做,因为我认为这可能不是您真正想要做的。但是如果你真的想这样做,你需要把它放在正确的命名空间中。

namespace glm {
namespace detail {
// But don't do this!  This is not a good idea...
bool operator <(const glm::vec2& l, const glm::vec2& r)
{
    int lsize = l.x + l.y;
    int rsize = r.x + r.y;
    return lsize < rsize;
}
}
}

但是等等!这是错误的!

  • vec2没有订购,所以实现 <在数学上没有任何意义
  • 覆盖库类型上的运算符不是一个好主意
  • vec2没有排序,所以你不应该把它们放在 std::map

A std::map保持其中的元素有序。那么,当您这样做时会发生什么?

int main(int argc, char* argv[])
{
    std::map<glm::vec2, int> m;
    m[glm::vec2(1, 1)] = 10;
    std::cout << m[glm::vec2(0, 2)] << '\n';
    return 0;
}

是的,这打印出 10即使我们从未将 (0, 2) 添加到 map 。

您可能想要使用空间索引(例如 quatdree)或至少使用字典顺序。除此之外,如果这是您真正想要的行为,您应该更改 std::map 上的比较器通过模板参数。

struct vec2_cmp {
    bool operator()(const glm::vec2 &x, const glm::vec2 &y) { ... }
}

std::map<glm::vec2, int, vec2_cmp> m;

关于c++ - 无法重载 glm::vec2 '<' 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29198077/

相关文章:

c++ - 参数化运算符重载

c++ - 数组 - 为什么下标运算符与标识符相关联?

C++:检查字符串是否是有效的 MD5 十六进制哈希

c++ - 通过引用捕获异常

大量使用运算符重载的 C++ XML 库

C++ While( cin >> x) 是如何工作的?

c++ - 对动态数组使用重载的 << 运算符

c++ - 如何使用 Attribute 作为 TinyXML2(C++) 的搜索关键字

java - 在 C++ 中创建一个 byte[][] 并使用 JNI 将其返回给 Java

c++ - std::atomic::operator++ 真的按值返回吗?