c++ - 在 sf::Vector 中重载 operator< 时出错

标签 c++ templates overloading sfml

我想使用 std::mapsf::Vector2i类,但出于某种原因我需要 overload < operator .由于 map 将代表 3x3网格,我想出了这个来对 vector 进行排序:

inline bool operator <(sf::Vector2i l, sf::Vector2i r)
{
    if (l.x * 3 + l.y < r.x * 3 + r.y) return 1;
    return 0;
}

但我仍然得到错误 C2678

no operator found which takes a left-hand operand of type 'const sf::Vector2i'

我对我的自定义 vector 类型做了同样的事情并且它起作用了,那么是什么导致了这个错误?

编辑:

此重载位于单独的 .cpp 中文件。 我只是将此重载包装在命名空间 sf{} 中它奏效了。为什么仅指定 sf::Vector2i 不起作用?在参数中?

最佳答案

让我们开始:

I want to use std::map with sf::Vector2i class, but for some reason I need to overload < operator.

A std::map通过 key 对其内容进行排序,这需要知道如何对 key 进行排序(大概是 sf::Vector2i )。默认情况下,键顺序的定义由 operator < 给出。 .这意味着 map 调用 operator<(const sf::Vector21&, const sf::Vector21&)确定一个键是否小于另一个键。因此,必须在某处定义此运算符。

如果您对此订单不感兴趣,可以尝试 unordered_map相反。

I just wrapped this overload in a namespace sf{} and it worked. Why doesn't it work by just specifying sf::Vector2i in the parameters?

这可能是 the lookup rules for dependent names 的结果.请记住调用 operator< ?它将在模板深处的某个地方创建,并且其参数的类型取决于模板参数。这样做的相关结果是编译器将查找模板定义中可见的声明(在头文件的深处),以及通过参数相关查找 (ADL) 找到的任何内容。您的重载在模板定义中不可见(也不应该),因此需要由 ADL 找到它。但是,参数都在命名空间 sf 中, 所以 ADL 只在命名空间 sf 中查找.因此,编译器可以在 sf 中找到重载。命名空间,但别处没有。

当参数位于 std 中时,这种情况更常见。命名空间,但也应适用于此处。 (其中一些对我来说是新的,所以我可能搞砸了一些细节。)主要的收获是试图覆盖仅作用于另一个命名空间中的类的运算符通常会失败。

好消息是您没有被卡住。 A std::map 采用两个以上的模板参数。第三个让您指定如何比较键。阅读该主题,看看您能走多远。

关于c++ - 在 sf::Vector 中重载 operator< 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50868045/

相关文章:

java - 什么是一致性构造函数?

c# - 在哪里重载除法返回自定义类 C# operator/(int,int)

c++ - Webassembly内存管理和指针

C++ HLSL 缓冲区变量

c++ - 什么时候拥有太多动态数组会很危险?

c++ - 模板特化,在一个函数中具有多个模板参数

C++ 重载和覆盖

c++ - QtCharts添加自定义轴

c++ - 定义与变量 a 相同类型的变量 b

c++ - 创建一个用 0,1,2,3 元组初始化的多维数组,