C++ 重载运算符时出错<;在sf::Vector中
我想将C++ 重载运算符时出错<;在sf::Vector中,c++,templates,overloading,sfml,C++,Templates,Overloading,Sfml,我想将std::map与sf::Vector2i类一起使用,但出于某种原因,我需要重载
std::map
与sf::Vector2i
类一起使用,但出于某种原因,我需要重载
。由于地图将表示一个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;
}
inline bool操作符让我们从以下内容开始:
我想将std::map
与sf::Vector2i
类一起使用,但出于某种原因,我需要重载让我们从以下内容开始:
我想将std::map
与sf::Vector2i
类一起使用,但由于某些原因,我需要重载,实际上,您的运算符不接受常量Vector2i。常数很重要 实际上,运算符不接受常量向量2i。常数很重要 是否在标题中声明?除了immibis之外:运算符的定义在使用时必须是“可见”的。通常的方法是:在需要的函数上面定义它,或者在头文件中定义它,该头文件是#在需要它的文件中包含d。它是在头文件中声明的吗?除了immibis之外:操作符的定义在使用它的地方必须是“可见的”。通常的方法是:将它定义到您需要的函数上面,或者在头文件中定义它,该头文件是#在您需要它的文件中包含d。在这种情况下为什么必须使用const a?对不起,不是。我错过了您的编辑,它在sf
名称空间中工作。我同意@JaMiT的观点,这可能是一个名称查找问题。通常,作为类接口“一部分”的自由函数、运算符或其他函数应在同一命名空间中声明。ADL将完成剩下的工作。通过声明operator<您正在扩展Vector2i的接口,并且应该将它放在同一名称空间中。const
如果参数是通过引用而不是值传递的,则非常重要。(这个答案也是我最初的想法之一。)说到这一点,通过常量引用而不是值传递将是一个好主意,@John@JaMiT是的,这就是为什么我首先发布了答案。我看描述太快了。不过,我还是投票赞成你的答案。我想它涵盖了要点。我希望我没有给人错误的印象。“我不是在向你解释,@ravnsgaard,而是在向随机阅读这些评论的人解释。”为什么在这种情况下必须使用常数?对不起,不是。我错过了您的编辑,它在sf
名称空间中工作。我同意@JaMiT的观点,这可能是一个名称查找问题。通常,作为类接口“一部分”的自由函数、运算符或其他函数应在同一命名空间中声明。ADL将完成剩下的工作。通过声明operator<您正在扩展Vector2i的接口,并且应该将它放在同一名称空间中。const
如果参数是通过引用而不是值传递的,则非常重要。(这个答案也是我最初的想法之一。)说到这一点,通过常量引用而不是值传递将是一个好主意,@John@JaMiT是的,这就是为什么我首先发布了答案。我看描述太快了。不过,我还是投票赞成你的答案。我想它涵盖了要点。我希望我没有给人错误的印象。“我不是在向你解释,@ravnsgaard,而是在向随机阅读这些评论的人解释。”