0

好的,所以我正在尝试制作(目前)不平衡的二叉树。我遇到了一个我似乎无法摆脱的奇怪错误。下半场也出现了同样的错误,所以我现在暂时摆脱了它。

    void insert( binTreeNode < T >*& node, const T& obj) { // private version of insert( )
    if (obj < node->data) {
        if(node->left != NULL)
            insert(node->left, obj);
        else {
            binTreeNode<T> n;
            n = new binTreeNode(obj, NULL, NULL);
            node->left = n;
        }
    } else {
        if(node->right != NULL)
            insert(node->right, obj);
        else {

        }
    }
}

和错误

In file included from ../src/binTree.cc:2:0:
../src/binTree.h: In member function 'void binTree<T>::insert(binTreeNode<T>*&, const T&)':
../src/binTree.h:54:16: error: expected type-specifier before 'binTreeNode'
../src/binTree.h:54:16: error: expected ';' before 'binTreeNode'
src/subdir.mk:24: recipe for target `src/binTree.o' failed
make: *** [src/binTree.o] Error 1

binTreeNode 的构造函数定义为

binTreeNode (const T& obj, binTreeNode < T >* leftObj = NULL, binTreeNode < T >* rightObj = NULL) {
    left = leftObj;
    right = rightObj;
    data = obj;
}

谢谢你的帮助。

4

2 回答 2

3
        n = new binTreeNode(obj, NULL, NULL);

应该

        n = new binTreeNode<T>(obj, NULL, NULL);

(另外, n 应该是一个指针)。

即使是明确的,类也不会从构造函数中自动推导出模板参数。我不确定为什么。如果添加另一个构造函数,也许是为了使代码不会变得脆弱。

无论如何,如果这真的让您感到困扰,您可以随时添加一个辅助函数:

template<typename T>
binTreeNode<T>* newBinTreeNode(const T& obj, binTreeNode<T>* left, binTreeNode<T>* right) {
  return new binTreeNode<T>(obj, left, right);
}
于 2013-03-22T02:14:43.283 回答
0

在类声明之外定义成员函数时,必须在定义之前insert()加上前缀:template<..>

template <typename T>
void binTree<T>::insert(binTreeNode < T >*& node, const T& obj) {
    if (obj < node->data) {
            if(node->left != NULL)
                insert(node->left, obj);
            else {
                binTreeNode<T> n;
                n = new binTreeNode(obj, NULL, NULL);
                node->left = n;
            }
    } else {
        if(node->right != NULL)
            insert(node->right, obj);
        else {

        }
    }
}
于 2013-03-22T01:43:01.523 回答