C++ (C+;+;)我应该将所有模板放在哪里?

C++ (C+;+;)我应该将所有模板放在哪里?,c++,class,templates,namespaces,C++,Class,Templates,Namespaces,我有不同的课程,都是按层次排列的。 为了减少代码量,我开始创建模板函数。基类将使用模板函数,一些派生类也将使用相同的函数。我应该把所有这些模板放在哪里,这样我就不会像以前那样遇到未定义的引用问题?我应该将所有的定义放在一个头文件中,然后将头文件包含在类中调用函数的.cpp部分。这样行吗?到目前为止,我所有的类(class.cpp,class.h)都编译得很好,但在链接过程中一切都崩溃了。我试图将所有模板放在一个名称空间中,然后将该名称空间包含在我所有类的实现中,但这似乎不起作用。我的问题是,如何

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

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


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

我看到很多人对此感到困惑。。。模板不是类型。 它们在实例化时成为类型。 因此,模板的成员必须与要使用它们的数据单元保持一致

若您的模板是通用的,并且希望在所有代码中使用它,那个么只需将所有内容都放在头文件中即可

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

例如,声明中的“list.h”和实现中的“list.inc”

要使其正常工作,您必须同时包含这两个选项。

可能的重复项