我有不同的类都排列在层次结构中。 为了减少代码量,我开始创建模板函数。基类将使用模板函数,一些派生类也将使用相同的函数。我想在哪里放置所有这些模板,所以我没有像我一样得到未定义的参考问题?我应该将所有定义放在头文件中,然后只将头文件包含在调用函数的类的.cpp部分中。那会有用吗?到目前为止,我的所有类(class.cpp,class.h)都编译得很好,但是在链接过程中一切都会爆炸。我试图将所有模板放在命名空间中,然后在我所有类的实现中包含该命名空间,但这似乎不起作用。我的问题是,您如何创建一个单独的实体,只保存任何类可以在其数据成员上使用的模板化函数?
答案 0 :(得分:2)
模板函数和模板类的定义属于头文件,而不是.cpp文件。
这是因为编译器必须为#include
标题文件中使用的每组模板参数生成一个全新的函数。如果模板函数是在.cpp文件中定义的,那么必须生成这些函数的所有适当版本,而不知道调用代码是什么样的,这基本上是不可能的。 (您确实以这种方式获得了模板函数的重复定义,但链接器会删除这些定义,并确保在最终二进制文件中每个模板实例化时只有一个副本。)
答案 1 :(得分:1)
我看到很多人对此事感到困惑......模板不是类型。 它们在实例化时成为类型。 因此,模板成员必须与您将要使用的数据单元保持一致。
如果您的模板是通用的,并且您想在所有代码中使用它,只需将所有内容放在头文件中。
现在,如果你不喜欢(我会理解)你在同一个文件中显示声明,定义和实现,你可以将模板分成两个不同的文件。
例如,带有声明的“list.h”和带有实现的“list.inc”。
要使其有效,您必须包括两者。