我有一个任务:
来实现一个模板向量类(让我们将其命名为myvector)。我需要在我的项目的多个文件中使用这个类,所以我将它的声明放在"myvector.h“文件中,并将其实现放在"myvector.hpp”文件中,然后在所有声明之后将"myvector.hpp“包含在"myvector.h”中(如there所述)。但是,我在"myvector.hpp“中有一个非模板函数。因此,当我在主文件中包含"myvector.h“文件时,一切工作正常。但是当我在另一个文件("bignum.cpp")中包含"myvector.h“时,我得到一个链接器错误:
error LNK2005: "unsigned int __cdecl gerasimov_dmitry::calculate_capacity(unsigned int)" (?calculate_capacity@gerasimov_dmitry@@YAII@Z) already defined in bignum.obj
我理解原因-- "bignum.h“代码同时包含在main.cpp和bignum.cpp文件中,因此编译器不知道使用哪个"calculate_capacity”函数。所以,我的问题是如何解决这种情况。
发布于 2011-04-18 18:57:27
您必须将函数声明为inline
(或者将定义移动到单个转换单元)。
您面临的问题是,如果您在标头中定义函数,并将该标头包含在多个翻译单元中,编译器将在所有翻译单元中生成该函数。
当链接器试图生成程序(或库)时,它会发现函数被定义了多次,并对此提出了抱怨,因为这违反了ODR (One Definition Rule)。通过将函数标记为inline
,编译器将标记该函数,以便当链接器看到多个定义而不是阻塞时,它将丢弃除一个定义之外的所有定义。
https://stackoverflow.com/questions/5707324
复制