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)

問題を見つけていただけますか?

ありがとう

編集: ソース ファイルの内容をヘッダー ファイルにコピーし、プロジェクトをコンパイルしました。それは素晴らしいことですが、私にはわからないので、誰かがそのエラーの理由を説明してくれたらとてもありがたいです。

4

1 に答える 1

4

エラーの理由は、常にすべてのテンプレート コードをヘッダー ファイルに配置する必要があるためです。AvlTree.cpp にあるすべてのコードを AvlTree.h に移動します (関数をインライン化します)。AvlTree.cpp を削除します。リンカーはテンプレート コードをリンクできません。コンパイラが定義を確認できるように、ヘッダー ファイルにある必要があります。説明については、こちらを参照してください。

于 2013-10-04T05:02:09.977 に答える