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