使用模板时未定义的引用

时间:2013-12-09 00:32:12

标签: c++ compilation compiler-errors

继续获取未定义的引用,其他答案说应该链接问题。我没有正确编译吗?或者代码中有什么问题?我已经尝试将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

3 个答案:

答案 0 :(得分:4)

您需要在标题中包含整个模板类定义。

答案 1 :(得分:3)

您不能对这样的模板使用单独的编译。编译器需要在使用点查看模板定义(模板函数体),或者不知道如何为int Stack<T>::Stack()实例生成代码(等)。您可以在stack.cpp中明确询问实例,但最好将函数定义移到头文件中。

答案 2 :(得分:0)

您可以从标题中分离实现,但您应该使用C ++ 11中的“extern templates”。