其他分享
首页 > 其他分享> > c-如果是模板,则包含头文件.

c-如果是模板,则包含头文件.

作者:互联网

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

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

解决方法:

在编译器读取其源代码时,模板实际上不会产生任何目标代码.当某些东西实际使用模板时,它们(通常)只是“实例化”.因此,如果您在一个源文件中定义一个模板函数,然后从另一个源文件中调用它,则该模板函数的代码根本不会被编译:因为它不需要任何内容​​,所以它不在第一个目标文件中,并且它不在第二个目标文件,因为编译器无法访问该函数的定义.

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

或者,您可以使用explicit instantiation:在.cpp文件中定义模板函数,并确切告诉编译器应为该函数编译的类型.这很难维护,因为您必须跟踪程序其余部分需要哪些实例化.如果某人调用foo< float>(),但是您仅显式实例化了foo< int>()和foo< char>(),则会出现缺少符号的错误.

您不应该#include另一个.cpp文件中的.cpp文件.只需将模板函数定义及其声明一起放在标头中即可.

标签:c,templates,header-files
来源: https://codeday.me/bug/20191011/1892141.html