2012-10-15 118 views
5

我试图用一个模板类,当我在LWS编译一个文件时,它的工作原理: http://liveworkspace.org/code/a9c412a7e683439dfa35a9363749369d模板生成错误:为建筑x86_64的未定义符号:

但是当我尝试编译它编造的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的文件

+1

你的模板函数体需要将所有在你的头文件。如果你使用你提到的那些行来修改它们,你在.cpp文件中有模板<>体,它们必须可供编译器执行演绎,因此必须在头文件中。 – WhozCraig

+0

这样我应该插入到头文件哪些行? –

+1

根据你的代码判断,如果有帮助,你甚至不需要*一个stack.cpp文件。将所有堆栈模板实现移至您的标题。 – WhozCraig

回答

7

听起来像是你需要放置的模板定义,是的,我已经包括stack.h堆回到头文件中。模板构成了代码生成的计划,因此,如果编译器无法看到整个模板定义并只能看到该声明,则不会生成该模板特定实例的代码。它只会信任声明,并期望在链接时存在一个包含这些模板实例的对象文件。解决方案是1)将模板定义保存在头文件中或2)预生成所需的定义,以便链接程序可以在链接时找到它们。

在这里看到: Template issue causes linker error (C++)

相关问题