继续获取未定义的引用,其他答案说应该链接问题。我没有正确编译吗?或者代码中有什么问题?我已经尝试将main放入stack.cpp并且它编译并运行良好,但我不确定还需要做什么来链接main.o和stack.o以及为什么它现在突然变得合适我我添加了这个文件。
stack.h:
#ifndef STACK_INCLUDED
#define STACK_INCLUDED
#include <cstddef>
template<typename T> struct Node {
Node(T _data, Node<T> * _next) : data(_data), next(_next) {}
T data;
Node<T> *next;
};
template<class T>
class Stack {
private:
Node<T> *first;
public:
Stack(void);
bool isEmpty(void);
void push(T n);
T pop(void);
};
#endif
stack.cpp:
#include "stack.h"
template<class T>
Stack<T>::Stack(void) {
first = NULL;
}
template<class T>
bool Stack<T>::isEmpty(void) {
return first == NULL;
}
template<class T>
void Stack<T>::push(T n) {
Node<T> *oldfirst = first;
Node<T> *newfirst = new Node<T>(n, oldfirst);
first = newfirst;
first->next = oldfirst;
}
template<class T>
T Stack<T>::pop(void) {
T data = first->data;
first = first->next;
return data;
}
main.cpp中:
#include <iostream>
#include "stack.h"
using namespace std;
int main(void) {
Stack<int> s;
if (!s.isEmpty()) {
cout << "not empty" << endl;
}
return 0;
}
尝试编译:
$ g++ stack.cpp -c
$ g++ main.cpp -c
$ g++ main.o stack.o
main.o: In function `main':
main.cpp:(.text+0x10): undefined reference to `Stack<int>::Stack()'
main.cpp:(.text+0x1c): undefined reference to `Stack<int>::isEmpty()'
collect2: ld returned 1 exit status
答案 0 :(得分:4)
您需要在标题中包含整个模板类定义。
答案 1 :(得分:3)
您不能对这样的模板使用单独的编译。编译器需要在使用点查看模板定义(模板函数体),或者不知道如何为int
Stack<T>::Stack()
实例生成代码(等)。您可以在stack.cpp中明确询问实例,但最好将函数定义移到头文件中。
答案 2 :(得分:0)
您可以从标题中分离实现,但您应该使用C ++ 11中的“extern templates”。