Неопределенные символы для архитектуры x86_64, сбой команды компоновщика с кодом выхода 1

У меня есть «Неопределенные символы для архитектуры x86_64», и я не могу понять причину. Вот заголовочный файл:

#include <string>
#include <iostream>
#include <iomanip>
#include "assert.h"using namespace std;

template <class Etype>
class AvlNode {
public:
Etype element;
AvlNode *parent;
AvlNode *left;
AvlNode *right;
int height;
AvlNode(Etype e,AvlNode *lt, AvlNode *rt, AvlNode *p,int h=0)
: element(e), left(lt), right(rt), parent(p), height(h) {}
};

template <class Etype>
class AvlTree {
public:
AvlTree() {root=NULL;}
~AvlTree() {makeEmpty();}

void makeEmpty() {makeEmpty(root);}
bool remove(Etype x) {return remove(root,x);}
void insert(Etype x) {return insert(x,root,NULL);}

bool tooHeavyLeft(AvlNode<Etype> * t);
bool tooHeavyRight(AvlNode<Etype> * t);
bool heavyRight(AvlNode<Etype> * t);
bool heavyLeft(AvlNode<Etype> * t);

protected:
AvlNode<Etype> *root;

void makeEmpty(AvlNode<Etype> *& t);
int height(AvlNode<Etype> *t);

bool remove(AvlNode<Etype> *& t,Etype word);
void insert(Etype x,AvlNode<Etype> *& t,AvlNode<Etype> *prev);

void rotateWithLeftChild(AvlNode<Etype> *& t);
void rorateWithRightChild(AvlNode<Etype> *& t);
void doubleWithLeftChild(AvlNode<Etype> *& t);
void doubleWithRightChild(AvlNode<Etype> *& t);
};

И вот исходный файл:

#include "AvlTree.h"
template <class Etype>
void AvlTree<Etype>::makeEmpty(AvlNode<Etype> *& t) {
if(t!=NULL) {
makeEmpty(t->left);
makeEmpty(t->right);
delete t;
}
t=NULL;
}

template <class Etype>
void AvlTree<Etype>::rotateWithLeftChild(AvlNode<Etype> *&t) {
assert(t!=NULL && t->left !=NULL);
AvlNode<Etype> *temp = t->left;
t->left = temp->right;
temp->right = t;
t->height = max( height( t->left ), height( t->right ) ) + 1;
temp->height = max( height( temp->left ), temp->height ) + 1;
t = temp;
}

template <class Etype>
int AvlTree<Etype>::height(AvlNode<Etype> *t) {
return t==NULL ? -1 : t->height;
}

И вот ошибка, которую я получаю:

Undefined symbols for architecture x86_64:
"AvlTree<int>::makeEmpty(AvlNode<int>*&)", referenced from:
AvlTree<int>::makeEmpty() in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Можете ли вы выяснить проблему?

Спасибо

Редактировать:
Я просто скопировал содержимое исходного файла в файл заголовка и проект скомпилирован. Это здорово, однако, я был бы очень признателен, если бы кто-нибудь объяснил мне причину этой ошибки, потому что я понятия не имею.

0

Решение

Причина ошибки заключается в том, что вы всегда должны помещать весь код шаблона в заголовочные файлы. Переместите весь код, который у вас есть в AvlTree.cpp, в AvlTree.h (и сделайте функции встроенными). Удалить AvlTree.cpp. Компоновщики не могут связывать код шаблона, он должен быть в заголовочном файле, чтобы компилятор мог видеть определения. Увидеть Вот для объяснения.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]