0

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

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

bool operator==(mapPoint const& p1, mapPoint const& p2){
    return p1.x == p2.x && p1.y == p2.y;
}

我有一些链接器错误。在包含标头的每个文件中,我都收到错误消息(复制符号 __XXXX_mapPointS1_)。

事实是当它被放入实现文件时它工作正常,我在其中将它与 unordered_set 一起使用。

我的问题是,我该如何解决这个问题?除了编译器之外,还有很多我无法理解的魔法。汉克斯

4

1 回答 1

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; }
于 2013-06-06T16:23:48.787 回答