错误:在'模板'之前预期的primary-expression

时间:2013-03-22 01:39:05

标签: c++ templates

好吧,所以我正在尝试创建一个(现在)不平衡的二叉树。我得到一个奇怪的错误,我似乎无法摆脱。下半场有同样的错误,所以我现在就摆脱它。

    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;
}

感谢您的帮助。

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分: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 {

        }
    }
}