在 sf::Vector 中重载运算符 < 时出错
Error when overloading operator< in sf::Vector
我想将 std::map
与 sf::Vector2i
class 一起使用,但出于某种原因我需要 overload < operator
。由于地图将代表一个 3x3
网格,我想出了这个来对向量进行排序:
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'
我对我的自定义矢量类型做了同样的事情并且它起作用了,那么是什么导致了这个错误?
编辑:
此重载位于单独的 .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
通过它们的键对其内容进行排序,这需要知道如何对键进行排序(大概是 sf::Vector2i
)。默认情况下,按键顺序的定义由 operator <
给出。这意味着地图调用 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
采用两个以上的模板参数。第三个让您指定如何比较键。阅读该主题,看看您能走多远。
实际上,您的操作员并没有采用 const Vector2i。常量很重要!
我想将 std::map
与 sf::Vector2i
class 一起使用,但出于某种原因我需要 overload < operator
。由于地图将代表一个 3x3
网格,我想出了这个来对向量进行排序:
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'
我对我的自定义矢量类型做了同样的事情并且它起作用了,那么是什么导致了这个错误?
编辑:
此重载位于单独的 .cpp
文件中。
我只是将此重载包装在命名空间 sf{}
中并且它起作用了。为什么仅在参数中指定 sf::Vector2i
不起作用?
让我们开始:
I want to use
std::map
withsf::Vector2i
class, but for some reason I need to overload<
operator.
A std::map
通过它们的键对其内容进行排序,这需要知道如何对键进行排序(大概是 sf::Vector2i
)。默认情况下,按键顺序的定义由 operator <
给出。这意味着地图调用 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 specifyingsf::Vector2i
in the parameters?
这可能是 the lookup rules for dependent names 的结果。还记得对 operator<
的调用吗?它将在模板深处的某个地方创建,并且其参数的类型取决于模板参数。这样做的相关结果是编译器将查找模板定义中可见的声明(在头文件的深处),以及通过参数相关查找 (ADL) 找到的任何内容。您的重载在模板定义中不可见(也不应该),因此需要由 ADL 找到它。但是,参数都在命名空间 sf
中,因此 ADL 仅在命名空间 sf
中查找。因此,编译器可以在 sf
命名空间中找到重载,但在其他地方找不到。
当参数位于 std
命名空间时,这种情况更常见,但也应适用于此。 (其中一些对我来说是新的,所以我可能搞砸了一些细节。)主要的收获是试图覆盖仅作用于另一个名称空间中的 类 的运算符通常会失败。
好消息是您没有卡住。 A std::map
采用两个以上的模板参数。第三个让您指定如何比较键。阅读该主题,看看您能走多远。
实际上,您的操作员并没有采用 const Vector2i。常量很重要!