【问题标题】:undefined reference when using templates使用模板时未定义的引用
【发布时间】:2013-12-09 08:49:18
【问题描述】:

继续获得未定义的参考,其他答案说应该是链接问题。我没有正确编译这个吗?还是代码有问题?我尝试将 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

【问题讨论】:

    标签: c++ compilation compiler-errors


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您不能对这样的模板使用单独的编译。编译器需要在使用时查看模板定义(模板函数体),或者它不知道如何为Stack&lt;T&gt;::Stack()int 实例生成代码(等等)。您可以在 stack.cpp 中显式请求实例,但最好将函数定义移动到头文件中。

      【讨论】:

        【解决方案3】:

        您可以将实现与标头分开,但您应该使用 C++11 中的“外部模板”。

        【讨论】:

        • 这行得通,但它需要为每个模板的使用提供明确的专业化,这在一般编码中变得相当乏味。它更常用作优化。例如,标准库的basic_string 几乎总是用作basic_string&lt;char&gt;,而不是让编译器在每个提到它的翻译单元中实例化它,然后让链接器除了一个之外都丢弃它,它通常在一个源中实例化库中的文件,&lt;string&gt; 标头将其声明为外部模板。 basic_string 的其他用法通过通常的机制。
        猜你喜欢
        • 1970-01-01
        • 2010-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-05
        • 2019-11-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多