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 returned 1 exit status 发生构建错误,构建停止 耗时:532 ms。

我该怎么办?

所有相关代码都在这里

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 回答