【问题标题】:(C++) where do I put all my templates?(C++)我把我所有的模板放在哪里?
【发布时间】:2011-12-13 09:25:24
【问题描述】:

我有不同的类都按层次结构排列。 为了减少代码量,我开始创建模板函数。基类将使用模板函数,一些派生类也将使用相同的函数。我应该把所有这些模板放在哪里,这样我就不会像以前那样遇到未定义的参考问题?我是否应该将所有定义放在头文件中,然后将该头文件包含在调用函数的类的 .cpp 部分中。那行得通吗?截至目前,我所有的类(class.cpp,class.h)都编译得很好,但是在链接过程中一切都崩溃了。我试图将所有模板放在一个命名空间中,然后将该命名空间包含在我所有类的实现中,但这似乎不起作用。我的问题是,您将如何创建一个单独的实体,该实体仅包含任何类都可以在其数据成员上使用的模板化函数?

【问题讨论】:

标签: c++ class templates namespaces


【解决方案1】:

模板函数和模板类的定义属于头文件,而不是.cpp文件。

这是因为编译器本质上必须为#includes 标头的文件中使用的每组模板参数生成一个全新的函数。如果模板函数是在 .cpp 文件中定义的,那么这些函数的所有适当版本都必须在不知道调用代码是什么样子的情况下生成,这基本上是不可能的。 (通过这种方式,您确实会得到模板函数的重复定义,但链接器会删除这些定义,并确保如果最终二进制文件中的每个模板实例化只有一个副本。)

【讨论】:

    【解决方案2】:

    我看到很多人对这件事感到困惑......模板不是类型。 它们在实例化时成为类型。 出于这个原因,模板的成员必须保留在您将要使用它们的同一数据单元中。

    如果您的模板是通用模板,并且您想在所有代码中使用它,只需将所有内容放在头文件中即可。

    现在,如果您不喜欢(我会理解)在同一个文件中显示声明、定义和实现,您可以将模板拆分为两个不同的文件。

    例如,“list.h”与您的声明和“list.inc”与您的实现。

    要使其工作,您必须同时包含两者。

    【讨论】:

      猜你喜欢
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      • 2012-10-14
      • 2013-09-21
      • 2020-09-30
      • 2019-07-11
      • 1970-01-01
      • 2012-10-22
      相关资源
      最近更新 更多