"多重定义..." "首先在这里定义"在数据结构的同一行

时间:2014-05-30 19:24:36

标签: c++ data-structures header-files

我在发布这篇帖子之前已经阅读了很多帖子,我找不到解决方案,因为它们(我读过的)都不是数据结构。

我有两个数据结构(如果重要,一个堆和一个UF)。
它们都在.h文件中实现。 我正在获得“多个定义...”“首次定义此处”错误仅适用于在类外部实现的成员函数(例如int UnionFind::Find(int i)
它也适用于c'tors和d'tors,但是当我在类中实现它们时,它就会消失。 我真的不知道为什么会这样。
我已经跟踪了所有文件中的包含,并且没有双重包含或循环。

我也在使用AVL树,它不会发生在那里,所有内容都在类外的.h文件中实现。

这些是我得到的错误:

/tmp/ccp8fP73.o: In function `UnionFind::Find(int)':
main.cpp:(.text+0x0): multiple definition of `UnionFind::Find(int)'
/tmp/ccVxSiPy.o:Elections.cpp:(.text+0x0): first defined here
/tmp/ccp8fP73.o: In function `UnionFind::Union(int, int)':
main.cpp:(.text+0x108): multiple definition of `UnionFind::Union(int, int)'
/tmp/ccVxSiPy.o:Elections.cpp:(.text+0x108): first defined here

如果您需要更多信息,请告诉我。 谢谢

1 个答案:

答案 0 :(得分:5)

如果我理解正确,你就是这样做的:

// C.h

class C
{
   void f(); // declaration of f; ok to include in many modules
};

// definition of f; must not exist in more than one module
void C::f()
{
}

这不起作用,因为f()的定义将在包含C.h的每个模块中结束,从而导致您描述的链接器错误。您可以通过将f()标记为inline,或将f()的定义移至单独的cpp文件来解决此问题。

有一种特殊情况允许这样,当f()是模板时(直接或因为C是模板)。在这种情况下,定义必须在标题中,以便编译器可以知道如何为您指定的任何类型实例化它。这确实使链接器变得困难,因为您可以并且经常最终得到通常是错误的各种冗余定义(例如,如果您在多个模块中使用f<int>())。需要特殊的行为才能解决这个问题。

顺便提一下,当你在类定义中移动函数体时,事情起作用的原因是因为它具有使它们隐式内联的效果。