2017-10-04 7 views
1

テンプレートタグを使用して数値データを使用できるようにする単純なバイナリ検索ツリーですが、私はいくつかの難しい問題があります誰かが助けることができる場合、どのように取り除く方法の手掛かりを持っていない、それは非常に高く評価されるだろう。私のためにポップアップし続けるエラーメッセージは、 "引数リストなしでテンプレート名 '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://stackoverflow.com)/questions/495021/why-can-templates-only-in-the-header-file)あなたは別のqueすぐにこのコードに関連しています。 –

+0

あなたはstd :: setを知っていますか? –

答えて

3

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

にあなたが最初BSTため<T>コンポーネントを忘れます。

は、他のすべてのエラーは、同じタイプである

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

であるべき。

3

あなたが明らかに使用しているBSTのようなクラステンプレートはタイプではありません。それはクラスタイプを作成するためのレシピです。どのようなエラーメッセージがあなたに(ほとんど)どこでもあなたの名前BSTを使用していることを伝えようとしている場合は、<山括弧>のすぐ後にテンプレート引数を指定する必要があります。例えば

は、

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

にコンパイラは、戻り値の型ではなく、正しくクラス型としてBST<T>指定1におけるBSTの最初のインスタンス文句を言っています。これはおそらく次のようになります。

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

[この一般規則には少なくとも2つの例外があります。 1つは、テンプレートの名前だけを、タイプまたは値の代わりにテンプレートが必要な別のテンプレートのテンプレート引数として使用できることです。

もう1つは「注入されたクラス名」と呼ばれます。クラステンプレートのメンバー(クラステンプレートのメンバーを含む)のスコープ内では、テンプレートの名前だけを「現在の」特殊化のエイリアスとして使用できます。

だから、実際には、あなたはまた、末尾の戻り値の型を使用して行うことができます:

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

を上記では、戻り値の型は、今までにBST<T>::後に来ていないので、される今の範囲にBST<T>の別名としてBSTを使用することができます。]

関連する問題