无法找出导致错误的原因"undefined reference to..."

Cannot figure out what causes "undefined reference to..." error

本文关键字:undefined to reference 错误      更新时间:2023-10-16

我刚开始学习c++编程语言,并试图实现二叉搜索树数据结构。

当我尝试用

编译文件时
g++ -c binary.cpp -o binary.o -std=c++11
g++ -c main.cpp -o main.o -std=c++11
g++ main.o binary.o -std=c++11

那么我总是得到一些错误说有一个"未定义的引用"到某个成员函数,比如

main.o: In function `BSTree<int>::insert(int const&)':
main.cpp:(.text.#some-more-text#.+0x16): undefined reference to 
 `BSTree<int>::insert(BSTreeNode<int>*, int const&)'
collect2: error: ld returned 1 exit status

下面的代码片段是一个极简的例子:

binary.hpp:

template<typename T>
class BSTreeNode {
public:
  T key;
  BSTreeNode<T> *left;
  BSTreeNode<T> *right;
  BSTreeNode(const T& key) : key(key), left(nullptr), right(nullptr) {};
};

template <typename T>
class BSTree {
protected:
  BSTreeNode<T> *root;
public:
  BSTree() {
    root = nullptr;
  }
  void insert(const T& key) {
    root = insert(root, key);
  }
protected:
  BSTreeNode<T>* insert(BSTreeNode<T>* node, const T& key);
};

binary.cpp

#include "binary.hpp"
template<typename T>
BSTreeNode<T>* BSTree<T>::insert(BSTreeNode<T>* node, const T& key) {
  if (not node) {
    return new BSTreeNode<T>(key);
  }
  if (key < node->key) {
    node->left = insert(node->left, key);
  } else if (key > node->key) {
    node->right = insert(node->right, key);
  } else {
    throw "Key already exists!";
  }
  return node;
}

main.cpp:

#include "binary.hpp"
#include <math.h>
int main(){
  BSTree<int> bt;
  for (int i=0; i<10; i++){
    bt.insert(pow(-1, i) * i);
  }

即使经过详尽的搜索,我仍然不知道我的代码有什么问题。

链接器无法解析模板类在单独文件中的函数定义。试着把它放在同一个头文件中,而不是cpp。

问题出在源文件中bstreet::insert()的模板定义中。简单地说,在main中调用bstreet::insert()。编译器需要模板函数BSTree::insert()的定义,但是找不到,因为它没有在头文件中定义。请记住,每个*.cpp文件是独立编译的。

我建议你在头文件中给出模板的定义,因为您必须在每个源文件中给出一个(可能不同的)定义。

相关文章: