我遇到了一个小问题:我有一个包含结构的unordered_set。我已经实现了哈希函数。但是当我第一次编译我的程序时,我得到一些编译器错误,说我没有实现重载“operator ==”。
问题在于,当我声明我的重载:
bool operator==(mapPoint const& p1, mapPoint const& p2){
return p1.x == p2.x && p1.y == p2.y;
}
我有一些链接器错误。在包含标头的每个文件中,我都有错误消息(复制符号__XXXX_mapPointS1_)。
事实是它放入实现文件时工作正常,我将它与unordered_set一起使用。
我的问题是,我该如何解决这个问题?除了我无法理解之外,编译器之外还有很多魔法。绞纱
答案 0 :(得分:1)
您了解在将其放入实施文件时没有出现此问题。
C ++编译器没有头文件和实现文件的概念。它只知道“翻译单元”,即cpp文件。头文件包含在C预处理器中。编译器只能看到一个文件。 如果您在多个cpp文件包含的标头中定义一个函数,并且该函数具有外部链接,那么链接器将会抱怨重复的定义。
通常,您应该只保留内联函数的标头定义。
如果你仍然想要这样做,你必须避免外部链接,或者通过声明内联函数,或者通过声明静态,或者通过在没有名称的命名空间内声明它(这是在内部定义东西的C ++方式)到翻译单位)。
namespace // local
{
bool operator==(mapPoint const& p1, mapPoint const& p2)
{ return p1.x == p2.x && p1.y == p2.y; }
}
或者,有点丑陋和C-ish:
static bool operator==(mapPoint const& p1, mapPoint const& p2)
{ return p1.x == p2.x && p1.y == p2.y; }
或者,因为这个函数看起来像是内联的一个很好的候选者:
inline bool operator==(mapPoint const& p1, mapPoint const& p2)
{ return p1.x == p2.x && p1.y == p2.y; }