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
答
例如,在
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>
的别名。]
你应该花一些时间阅读[为什么模板只能在头文件中实现?](https://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file)会让你免于问另一个问题这个代码很快就会与此代码相关。 –
你知道std :: set吗? – 2017-10-04 11:51:05