我在发布这篇帖子之前已经阅读了很多帖子,我找不到解决方案,因为它们(我读过的)都不是数据结构。
我有两个数据结构(如果重要,一个堆和一个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
如果您需要更多信息,请告诉我。 谢谢
答案 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>()
)。需要特殊的行为才能解决这个问题。
顺便提一下,当你在类定义中移动函数体时,事情起作用的原因是因为它具有使它们隐式内联的效果。