我正在尝试使用模板类,当我在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
Run Code Online (Sandbox Code Playgroud)
是的我在stack.cpp和main.cpp文件中包含了stack.h
听起来你需要将堆栈的模板定义放回头文件中.模板构成了代码生成的计划,因此如果编译器无法看到整个模板定义并且只看到声明,则不会生成该模板的特定实例的代码.它将简单地信任声明,并期望在链接时存在具有这些模板的实例的对象文件.解决方案是1)将模板定义保留在头文件中或2)预生成所需的定义,以便链接器可以在链接时找到它们.
请参见此处: 模板问题导致链接器错误(C++)