当我使用模板为类编写 C++ 代码并在源 (CPP) 文件和头 (H) 文件之间拆分代码时,在链接最终可执行文件,尽管目标文件已正确构建并包含在链接中。这里发生了什么,我该如何解决?
最佳答案
模板类和函数在使用之前不会被实例化,通常在单独的 .cpp 文件中(例如程序源)。使用模板时,编译器需要该函数的完整代码才能构建具有适当类型的正确函数。但是,在这种情况下,该函数的代码在模板的源文件中有详细说明,因此不可用。
由于所有这些,编译器只是假设它是在其他地方定义的,并且只插入对模板化函数的调用。在编译模板的源文件时,程序源中使用的特定模板类型并没有在那里使用,因此它仍然不会生成函数所需的代码。这会导致无法解析的外部符号。
对此可用的解决方案是:
- 包括完整的定义 中的成员函数 模板的头文件并且没有 模板的源文件,
定义所有的成员函数 模板的源文件为 "inline"(更新:[这不适用于 Visual Studio 2017+]),或定义成员 模板源中的函数 使用“导出”关键字。 不幸的是,这不受支持 由许多编译器编写。(更新:this has been removed from the standard as of C++11。)
当编译器试图在程序源代码中构建类型化函数时,通过让编译器访问模板化函数的完整代码,1 和 2 基本上都解决了这个问题。
关于c++ - 为什么在使用模板时出现 "unresolved external symbol"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/456713/