我正在尝试创建一个使用模板的二叉搜索树结构。但是,当我尝试编译时出现错误。我不明白为什么我会得到“未定义的引用”,因为BSTree具有定义的功能BSTree()。
TreeHashTableDemo.o:TreeHashTableDemo.cpp:(.text+0x21): undefined reference to `BSTree<MechPart>::BSTree()'
TreeHashTableDemo.o:TreeHashTableDemo.cpp:(.text+0x21): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `BSTree<MechPart>::BSTree()'
TreeHashTableDemo.o:TreeHashTableDemo.cpp:(.text+0x1d0): undefined reference to `BSTree<MechPart>::add(MechPart&)'
作为C ++的新手,我没有这种类型的编译器错误的经验,因为我的代码始终可以正常编译 我的代码:
TreeHashTableDemo.cpp
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <time.h>
#include <sstream>
#include "BSTree.h"
#include "MechPart.h"
using namespace std;
int main()
{
BSTree<MechPart> treeValues;
MechPart part;
cout << "The program has finished." << endl;
return 0;
}
BSTree.h
#ifndef BSTREE_H
#define BSTREE_H
#include <cstdlib>
#include <iostream>
#include "BTNode.h"
template <typename Item>
class BSTree{
public:
BSTree();
BSTree(Item& data);
~BSTree();
void add(Item& data);
std::size_t size();
Item root() const;
private:
BTNode<Item>* root_;
std::size_t nodes;
};
#endif
BSTree.cpp
#include <cassert>
#include "BSTree.h"
template <typename Item>
BSTree<Item>::BSTree()
{
root_ = NULL;
nodes = 0;
}
template <typename Item>
BSTree<Item>::BSTree(Item& data)
{
root_ = new BTNode<Item>(data);
nodes = 1;
}
template <typename Item>
BSTree<Item>::add(Item& data)
{
root_ = new BTNode<Item>(data);
nodes = 1;
}
BTNode.h
#ifndef BTNODE_H
#define BTNODE_H
#include <cstdlib>
template <typename Item>
class BTNode
{
public:
BTNode(const Item& init_data = Item(),BTNode* init_left = NULL,BTNode* init_right = NULL)
{
data = init_data;
left = init_left;
right = init_right;
}
void set_data(const Item& new_data) {data = new_data;}
void set_left (BTNode* left_child) {left = left_child;}
void set_right(BTNode* right_child) {right = right_child;}
Item get_data() const {return data;}
Item& get_data() {return data;}
const BTNode* get_left() const {return left;}
BTNode* get_left() {return left;}
const BTNode* get_right() const {return right;}
BTNode* get_right() {return right;}
bool is_leaf() const {return (left == NULL) && (right == NULL);} //if it is the last one then its children will return NULL
private:
Item data;
BTNode* left;
BTNode* right;
};
#endif