在模板的情况下包含头文件。

时间:2011-09-28 14:24:49

标签: c++ templates header-files

当我们创建一个类时,我们在头文件中声明它的函数并在源文件中定义它们...然后头文件可以包含在主文件中以使用该类......

但是如果我们在头文件中声明一个模板类并在.cpp文件中定义它,然后如果我们在主(包含int main)文件中包含头文件那么为什么会出现链接器错误...和如果我们在主文件中包含.cpp文件(包含头文件),则不会出现错误...任何答案都是PLZ?

2 个答案:

答案 0 :(得分:5)

模板在编译器读取源代码时实际上不会生成任何目标代码。当实际使用模板时,它们(通常)仅“实例化”。因此,如果您在一个源文件中定义模板函数,并从另一个源文件中调用它,则模板函数的代码根本不会被编译:它不在第一个目标文件中,因为没有任何需要它,并且它不在第二个目标文件,因为编译器无法访问函数的定义。

您可以在头文件中定义模板函数,以便在每个转换单元中调用模板函数时,编译器可以访问其代码,并可以使用适当的模板参数编译它的副本。

或者,你可以使用explicit instantiation:你在.cpp文件中定义模板函数,也告诉编译器它应该准确编译函数的类型。这很难维护,因为您必须跟踪程序其余部分需要哪些实例化。如果某些内容调用了foo<float>(),但您只是明确地实例化foo<int>()foo<char>(),则会出现丢失符号错误。

您不应该#include来自其他.cpp文件的.cpp文件。只需将模板函数定义与其声明一起放在标题中即可。

答案 1 :(得分:1)

模板既不是类也不是函数。它是编译器用来生成类或函数的模式。

HERE中非常好地解释