C++模板二叉搜索树 - 参数列表错误

问题描述:

我要的是一个相当简单的二叉搜索树是通过模板标签,允许将内所使用的所有数值数据,但我有一些比较讨厌的问题,我没有线索如何摆脱,如果任何人都可以帮助,将不胜感激。弹出对我的错误信息是“无效使用模板名'BST'没有参数列表” - 坦率地说,我不知道如何解决它。它发生在bst.cpp文件的第31,89,105,120,130,141行。鉴于我对二叉搜索树的熟练程度不够高,我宁愿尽可能确定答案(即使提及确切地在哪里以及需要改变什么):C++模板二叉搜索树 - 参数列表错误

Main.cpp的

#include <iostream> 
#include "bst.h" 

using namespace std; 

int main() 
{ 

    BST <int> tree; 
    tree.insert(8); 
    tree.insert(25); 
    tree.insert(99); 
    tree.insert(20); 
    tree.insert(25); 
    tree.insert(20); 
    tree.insert(2); 
    tree.insert(89); 
    tree.insert(15); 
    tree.insert(10); 
    tree.insert(30); 
    tree.insert(50); 
    tree.displayorder(); 



    int number; 

    int Inputnumber; 
    while (true){ 
     cout << "Choose what you want to do: " << endl << "1# Insert" << endl << "2# Display Orders" << endl << "3# Search" << endl << "4# Delete" << endl << endl << endl; 
     cin >> Inputnumber; 
     if (Inputnumber==1){ 
      cout << endl << "Enter the number you want inserted: "; 
      cin >> number; 
      tree.insert(number); 
      cout << endl << endl << endl; 
     } 
     if (Inputnumber==2){ 
      cout<<"Display Orders: " << endl; 
      tree.displayorder(); 
      cout << endl << endl << endl; 
     } 

     if (Inputnumber==3){ 
      cout<<"Enter the number you want to search for: "; 
      cin >> number; 
      tree.search(number); 
      cout << endl << endl << endl; 
     } 
     if (Inputnumber==4){ 
      cout << "Enter the number you want to remove: "; 
      cin >> number; 
      tree.remove(number); 
      cout << endl << endl << endl; 
     } 
    } 
} 

BST.cpp

#include <iostream> 
#include "bst.h" 

using namespace std; 

template <class T> 
void BST<T>::preorder(node* tree) 
{ 
    if(tree == NULL){ 
     return; 
    } 
    cout << tree->data << " "; 
    inorder(tree->left); 
    inorder(tree->right); 
} 



template <class T> 
void BST<T>::postorder(node* tree) 
{ 
    if(tree == NULL){ 
     return; 
    } 
    inorder(tree->left); 
    inorder(tree->right); 
    cout << tree->data << " "; 
} 

template <typename T> 
BST::node* BST<T>::find(node* tree, T x)  //ERROR HERE 
{ 
    if(tree == NULL) 
     return NULL; 
    else if(x < tree->data) 
     return find(tree->left, x); 
    else if(x > tree->data) 
     return find(tree->right, x); 
    else 
     return tree; 
} 
template <typename T> 
BST<T>::BST() 
{ 
    root = NULL; 
} 

template <typename T> 
BST<T>::~BST() 
{ 
    root = makeEmpty(root); 
} 

template <class T> 
void BST<T>::insert(T x) 
{ 
    root = insert(x, root); 
} 

template <class T> 
void BST<T>::remove(T x) 
{ 
    root = remove(x, root); 
} 

template <class T> 
void BST<T>::displayorder() 
{ 
    inorder(root); 
    cout << endl; 
    preorder(root); 
    cout << endl; 
    postorder(root); 
    cout << endl << endl; 
} 

template <class T> 
void BST<T>::search(T x) 
{ 
    if(root = find(root, x)){ 
     cout << endl << "Found!" << endl; 
    } 
    else{ 
     cout << endl << "Not Found!" << endl; 
    } 
} 

template <class T> 
BST::node* BST<T>::makeEmpty(node* tree)  //ERROR HERE 
{ 
    if(tree == NULL) 
     return NULL; 
    { 
     makeEmpty(tree->left); 
     makeEmpty(tree->right); 
     delete tree; 
    } 
    return NULL; 
} 




template <class T> 
BST::node* BST<T>::insert(T x, node* tree)  //ERROR HERE 
{ 
    if(tree == NULL) 
    { 
     tree = new node; 
     tree->data = x; 
     tree->left = tree->right = NULL; 
    } 
    else if(x < tree->data) 
     tree->left = insert(x, tree->left); 
    else if(x >= tree->data) 
     tree->right = insert(x, tree->right); 
    return tree; 
} 

BST::node* BST::findMin(node* tree)    //ERROR HERE 
{ 
    if(tree == NULL) 
     return NULL; 
    else if(tree->left == NULL) 
     return tree; 
    else 
     return findMin(tree->left); 
} 

BST::node* BST::findMax(node* tree)    //ERROR HERE 
{ 
    if(tree == NULL) 
     return NULL; 
    else if(tree->right == NULL) 
     return tree; 
    else 
     return findMax(tree->right); 
} 

template <typename T> 
BST::node* BST<T>::remove(T x, node* tree)  //ERROR HERE 
{ 
    node* temp; 
    if(tree == NULL) 
     return NULL; 
    else if(x < tree->data) 
     tree->left = remove(x, tree->left); 
    else if(x > tree->data) 
     tree->right = remove(x, tree->right); 
    else if(tree->left && tree->right) 
    { 
     temp = findMin(tree->right); 
     tree->data = temp->data; 
     tree->right = remove(tree->data, tree->right); 
    } 
    else 
    { 
     temp = tree; 
     if(tree->left == NULL) 
      tree = tree->right; 
     else if(tree->right == NULL) 
      tree = tree->left; 
     delete temp; 
    } 

    return tree; 
} 

template <class T> 
void BST<T>::inorder(node* tree) 
{ 
    if(tree == NULL){ 
     return; 
    } 
    inorder(tree->left); 
    cout << tree->data << " "; 
    inorder(tree->right); 
} 

BST.h

#ifndef BST_H 
#define BST_H 


template <class T> 
class BST 
{ 
    struct node 
    { 
     T data; 
     node* left; 
     node* right; 
    }; 

    node* root; 

    node* makeEmpty(node* tree); 

    node* insert(T x, node* tree); 

    node* findMin(node* tree); 

    node* findMax(node* tree); 

    node* remove(T x, node* tree); 

    void inorder(node* tree); 

    void preorder(node* tree); 



    void postorder(node* tree); 


public: 
    BST(); 

    ~BST(); 


    node* find(node* tree, T x); 

    void insert(T x); 

    void remove(T x); 

    void displayorder(); 

    void search(T x); 
}; 

#endif // BST_H 
+6

你应该花一些时间阅读[为什么模板只能在头文件中实现?](https://*.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file)会让你免于问另一个问题这个代码很快就会与此代码相关。 –

+0

你知道std :: set吗? – 2017-10-04 11:51:05

例如,在

BST::node* BST<T>::find(node* tree, T x) 

您忘记了<T>组件的第一BST

应该

// vvv 
BST<T>::node* BST<T>::find(node* tree, T x) 

所有其他错误都是相同类型的。

像你显然使用BST类模板是不是一个类型。这是创建类类型的秘诀。什么错误消息是想告诉大家的是,(几乎)任何地方,你使用的名称BST,你需要后立即提供内部<尖括号>模板参数。

例如,在

template <class T> 
BST::node* BST<T>::makeEmpty(node* tree)  //ERROR HERE 

编译器抱怨的BST在返回类型的第一个实例,而不是一个正确地指定BST<T>作为类型。这可能应该是:

template <class T> 
BST<T>::node* BST<T>::makeEmpty(node* tree) 

[这个一般规则至少有两个例外。一个是单独模板的名称可以用作另一个模板的模板参数,该模板需要模板而不是类型或值。

另一个称为“注入类名”:在类模板的范围内(包括类模板成员),可以只使用模板的名称作为“当前”特化的别名。在该范围内

template <class T> 
auto BST<T>::makeEmpty(node* tree) -> BST::node* 

在上面,因为返回类型现在正值BST<T>::之后而不是之前,现在是:

所以其实你也可以使用一个尾随返回类型和做因此你可以使用BST作为BST<T>的别名。]