C++ 带有自定义谓词的无序_集生成链接器错误(重复符号)

C++ 带有自定义谓词的无序_集生成链接器错误(重复符号),c++,duplicate-symbol,C++,Duplicate Symbol,我遇到了一个小问题:我有一个无序的集合,其中包含一个结构。我已经实现了hash函数。但是当我第一次编译我的程序时,我遇到了一些编译器错误,说我没有实现重载的“operator==” 问题是,当我声明重载时: bool operator==(mapPoint const& p1, mapPoint const& p2){ return p1.x == p2.x && p1.y == p2.y; } 我有一些链接错误。在包含头的每个文件中,我都会收到错误消息

我遇到了一个小问题:我有一个无序的集合,其中包含一个结构。我已经实现了hash函数。但是当我第一次编译我的程序时,我遇到了一些编译器错误,说我没有实现重载的“operator==”

问题是,当我声明重载时:

bool operator==(mapPoint const& p1, mapPoint const& p2){
    return p1.x == p2.x && p1.y == p2.y;
}
我有一些链接错误。在包含头的每个文件中,我都会收到错误消息(重复符号uuuxxxx\umappoints1)

事实上,当它被放入实现文件中时,它工作得很好,在那里我将它与无序的_集一起使用


我的问题是,我如何解决这个问题?编译器之外还有太多我无法理解的魔力。hanks

您知道,当您将其放入实现文件中时,它不会有这个问题

C++编译器对头文件和实现文件没有任何概念。它只知道“翻译单位”,即cpp文件。头文件由C预处理器包含。编译器只看到一个文件。 如果在由多个cpp文件包含的标头中定义了一个函数,并且该函数具有外部链接,则链接器将抱怨重复的定义

通常,应该只保留内联函数的标题定义

如果您仍然想这样做,您必须避免外部链接,要么通过声明函数内联,要么声明静态,或者在没有名称的命名空间内声明它(这是C++内部定义翻译单元的方法)。 或者,有点难看和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; }

看起来您的
操作符==
具有外部链接。要么将其
内联
,要么将实现(=函数定义/body)放在源文件中,而不是放在头文件中。感谢您的帮助。让它像一个符咒一样工作。事实上,我必须给出(=)的一个实现而不使用它(因为无序的集合),这让我陷入了大麻烦。我在头中尝试了名称空间技巧,但编译器抱怨没有找到它。所以我有点困惑,因为在C++书籍中,他们把文件中的(空)文件放在了我的面前,这对我来说是个问题。我真的很感谢你的帮助。非常感谢。只要其他翻译单元看到函数的声明,就可以将它放在实现文件中。也就是说,
extern bool操作符==(mapPoint const&,mapPoint const&)没有更多内容(函数已声明但未定义)。
inline bool operator==(mapPoint const& p1, mapPoint const& p2)
    { return p1.x == p2.x && p1.y == p2.y; }