在模板类中使用非模板函数

时间:2011-04-18 18:38:11

标签: c++ templates linker linker-errors

我有一个任务:

实现模板矢量类(让我们将它命名为myvector)。我需要在我的项目中的多个文件中使用这个类,所以我把它的声明放在“myvector.h”文件中,并将其实现到“myvector.hpp”文件中,然后在“myvector”中包含“myvector.hpp”。 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”函数。所以,我的问题是如何解决这种情况。

1 个答案:

答案 0 :(得分:4)

您必须声明函数inline(或者将定义移动到单个翻译单元)。

您面临的问题是,如果您定义标头中的函数,并将该标头包含在多个转换单元中,编译器将在 all <生成函数/ em>翻译单位。

当链接器尝试生成程序(或库)时,它会多次发现该函数被定义并抱怨它,因为这违反了ODR(一个定义规则)。通过将函数标记为inline,编译器将标记该函数,以便当链接器看到多个定义而不是阻塞时,它将丢弃除一个定义之外的所有定义。