"多个定义......""首先在此定义"在数据结构的同一行中

Nad*_*led 0 c++ header-files data-structures

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

我有两个数据结构(如果重要,一个堆和一个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
Run Code Online (Sandbox Code Playgroud)

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

dlf*_*dlf 6

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

// 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()
{
}
Run Code Online (Sandbox Code Playgroud)

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

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

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