当我们创建一个类时,我们在头文件中声明它的函数并在源文件中定义它们...然后头文件可以包含在主文件中以使用该类......
但是如果我们在头文件中声明一个模板类并在.cpp文件中定义它,然后如果我们在主(包含int main)文件中包含头文件那么为什么会出现链接器错误...和如果我们在主文件中包含.cpp文件(包含头文件),则不会出现错误...任何答案都是PLZ?
答案 0 :(得分:5)
模板在编译器读取源代码时实际上不会生成任何目标代码。当实际使用模板时,它们(通常)仅“实例化”。因此,如果您在一个源文件中定义模板函数,并从另一个源文件中调用它,则模板函数的代码根本不会被编译:它不在第一个目标文件中,因为没有任何需要它,并且它不在第二个目标文件,因为编译器无法访问函数的定义。
您可以在头文件中定义模板函数,以便在每个转换单元中调用模板函数时,编译器可以访问其代码,并可以使用适当的模板参数编译它的副本。
或者,你可以使用explicit instantiation:你在.cpp
文件中定义模板函数,和也告诉编译器它应该准确编译函数的类型。这很难维护,因为您必须跟踪程序其余部分需要哪些实例化。如果某些内容调用了foo<float>()
,但您只是明确地实例化foo<int>()
和foo<char>()
,则会出现丢失符号错误。
您不应该#include
来自其他.cpp
文件的.cpp
文件。只需将模板函数定义与其声明一起放在标题中即可。
答案 1 :(得分:1)
模板既不是类也不是函数。它是编译器用来生成类或函数的模式。
在 HERE中非常好地解释