c++ - 为什么在使用模板时出现 "unresolved external symbol"错误?

标签 c++ templates linker

当我使用模板为类编写 C++ 代码并在源 (CPP) 文件和头 (H) 文件之间拆分代码时,在链接最终可执行文件,尽管目标文件已正确构建并包含在链接中。这里发生了什么,我该如何解决?

最佳答案

模板类和函数在使用之前不会被实例化,通常在单独的 .cpp 文件中(例如程序源)。使用模板时,编译器需要该函数的完整代码才能构建具有适当类型的正确函数。但是,在这种情况下,该函数的代码在模板的源文件中有详细说明,因此不可用。

由于所有这些,编译器只是假设它是在其他地方定义的,并且只插入对模板化函数的调用。在编译模板的源文件时,程序源中使用的特定模板类型并没有在那里使用,因此它仍然不会生成函数所需的代码。这会导致无法解析的外部符号。

对此可用的解决方案是:

  1. 包括完整的定义 中的成员函数 模板的头文件并且没有 模板的源文件,
  2. 定义所有的成员函数 模板的源文件为 "inline"(更新:[这不适用于 Visual Studio 2017+]),或
  3. 定义成员 模板源中的函数 使用“导出”关键字。 不幸的是,这不受支持 由许多编译器编写。(更新:this has been removed from the standard as of C++11。)

当编译器试图在程序源代码中构建类型化函数时,通过让编译器访问模板化函数的完整代码,1 和 2 基本上都解决了这个问题。

关于c++ - 为什么在使用模板时出现 "unresolved external symbol"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/456713/

相关文章:

c++ - 将 float 转换为 int,还是将 int 转换为 float?

javascript - 在模板内渲染剑道网格导致错误

ruby-on-rails - mustache 中标签助手的正确程序

macos - 运行 `cc` 时无法执行链接器 "cargo build"错误

matlab - 从 MATLAB 创建 DLL

c++ - 在 QT C++ 中更改 QColor

c++ - Linux 中是否可以检测 USB 扩展卡的存在?

c++ 免费(非 gpl)网络服务框架

c++ - unique_ptr 什么时候需要一个完整的类型?

linux - 加载现有库失败