7

我正在尝试使用模板类,当我在 LWS 的一个文件中编译它时,它可以工作:

(链接失效)~http://liveworkspace.org/code/a9c412a7e683439dfa35a9363749369d~

但是当我尝试编译它由 3 个文件组成时,

stack.h 第 4 到 21 行

stack.cpp 第 24 到 48 行

main.cpp 第 49 行到结束

当我尝试编译这 3 个文件时,我得到

Undefined symbols for architecture x86_64:
  "Stack2<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::push(Node**, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)", referenced from:
      _main in ccCoizCT.o
  "Stack2<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::top(Node*&)", referenced from:
      _main in ccCoizCT.o
  "Stack2<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::pop(Node*&)", referenced from:
      _main in ccCoizCT.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

是的,我在 stack.cpp 和 main.cpp 文件中包含了 stack.h

4

1 回答 1

12

听起来您需要将堆栈的模板定义放回头文件中。模板形成了代码生成计划,因此如果编译器看不到整个模板定义而只看到声明,则不会生成模板特定实例的代码。它只会信任该声明,并期望在链接时存在一个包含这些模板实例的对象文件。对此的解决方案是 1) 将模板定义保留在头文件中或 2) 预先生成所需的定义,以便链接器可以在链接时找到它们。

请参阅此处: 模板问题导致链接器错误(C++)

于 2012-10-15T23:31:29.130 回答