4

C++ でツリー クラスを作成しようとしていますが、再帰を使用しているときにテンプレートをどのように使用すればよいかわかりません。

たとえば、次の機能があります。

template <typename Data>
void destroyTree(typename AVLTree<Data>::Node* element) {
    if(!element) {
        return;
    }
    destroyTree(element->getLeft());
    destroyTree(element->getRight());
    delete element;
}

または、次のようにする必要があります。

template <typename Data>
void destroyTree(typename AVLTree<Data>::Node* element) {
    if(!element) {
        return;
    }
    destroyTree<Data>(element->getLeft());
    destroyTree<Data>(element->getRight());
    delete element;
}

次に、次の関数からそれを呼び出すとします。

template <typename Data>
void AVLTree<Data>::function() {
    destroyTree(root);
}

また:

template <typename Data>
void AVLTree<Data>::function() {
    destroyTree<Data>(root);
}

上記の可能性のほとんどを組み合わせようとしましたが、常にエラーが発生します。通常、それはnon matching function for call to

誰かがその問題の経験があれば、私を助けてください。

ありがとうございました。

Nawaz の提案を使用すると、次のエラーが発生します。

ビルドには内部ビルダーが使用されます ** g++ -O0 -g3 -Wall -c -fmessage-length=0 -oAVLTest.o ..\AVLTest.cpp g++ -oAVLTree.exe AVLTest.o AVLTest.o: 関数 ZN15Data_Structures7AVLTreeIiE4Node7getLeftEv 内: C:/Users/Alex/workspace/AVLTree/Debug/../AVLTree.h:(.text$_ZN15Data_Structures11destroyTreeIiEEvPNS_7AVLTreeIT_E4NodeE[void Data_Structures::destroyTree(Data_Structures::AVLTree::Node*)]+0x47): Data_Structures への未定義の参照: :AVLTree::Node::~Node()' collect2: ld が 1 つの終了ステータスを返しました ビルド エラーが発生し、ビルドが停止しました 消費時間: 532 ミリ秒。

私はそれで何ができますか?

関連するコードはすべてここにあります。

4

1 に答える 1

5

正解です:

//in the first case
destroyTree<Data>(element->getLeft());
destroyTree<Data>(element->getRight());

//in the second case
destroyTree<Data>(root);

つまり、テンプレート引数を指定する必要があります。これは、推定できないコンテキストであるため、関数引数からコンパイラによって推定できないためです。

于 2012-12-07T15:16:47.507 に答える