c++ - 在模板类中使用非模板函数

标签 c++ templates linker linker-errors

我有一个任务:

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

最佳答案

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

您面临的问题是,如果您在 header 中定义 函数,并将该 header 包含在多个翻译单元中,编译器将在所有 翻译单元。

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

关于c++ - 在模板类中使用非模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5707324/

相关文章:

c++ - 在 Direct2D 中绘制部分图像

c++ 用于unix命令行操作

django - 模板django中的随机字符串

javascript - 在 Angular 中的 `template` 的 `directive` 上使用过滤器

c++ - 使用某些静态库时在开罗出现段错误

c++ - 从第二个线程访问主线程中的变量

c++ - 如何在 C++ 中限制模板参数?

c++ - 模板赋值运算符(成员函数)实现的正确语法

c - 什么负责确保所有符号都是已知/定义的?

Swift 测试链接器错误