【问题标题】:Using non-template functions in template classes在模板类中使用非模板函数
【发布时间】:2011-04-18 18:38:11
【问题描述】:

我有一个任务:

实现一个模板向量类(我们将其命名为 myvector)。我需要在我的项目的多个文件中使用这个类,所以我把它的声明放在“myvector.h”文件中,并将实现放在“myvector.hpp”文件中,然后在“myvector.hpp”中包含“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

我了解原因 - main.cpp 和 bignum.cpp 文件中都包含“bignum.h”代码,因此编译器不知道要使用哪一个“calculate_capacity”函数。所以,我的问题是如何解决这种情况。

【问题讨论】:

    标签: c++ templates linker linker-errors


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。内联工作正常。我试图将定义移动到单个翻译单元,但我认为我做错了:)
    猜你喜欢
    • 2010-12-20
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多