带有自定义谓词的unordered_set使链接器错误(重复符号)

时间:2013-06-06 15:47:48

标签: c++ duplicate-symbol

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

问题在于,当我声明我的重载:

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

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

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

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

1 个答案:

答案 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; }