将二叉搜索树(BST)转为模板类时遇编译错误求助
解决BST模板类Insert方法的编译错误
你碰到的这个编译错误,核心原因很简单——当把BST改成模板类后,所有直接写BST的地方都必须带上模板参数<Type>,编译器需要明确知道你使用的是针对哪种类型实例化的BST类,不然它就会懵圈。
看你给出的代码片段,有几处关键的地方没加模板参数,我帮你修正后的代码如下:
template <class Type> BST<Type>* BST<Type>::Insert(BST<Type>* root, Type value) { if(!root) { return new BST<Type>(value); } if(value > root->data) { root->right = Insert(root->right, value); } else { root->left = Insert(root->left, value); } return root; }
具体的修改点我给你列出来:
- 返回类型和参数类型:把原来的
BST*全部改成BST<Type>*,明确指定这是对应Type类型的BST指针 - 类成员函数限定:
BST<Type>::Insert这里必须加上<Type>,告诉编译器这是模板类BST<Type>的成员函数 - 实例化新对象:
new BST(value)要改成new BST<Type>(value),创建对应类型的BST节点实例
另外还要注意,你的BST类本身的定义也得是模板类,比如类的声明应该类似这样:
template <class Type> class BST { public: Type data; BST<Type>* left; BST<Type>* right; // 构造函数 BST(Type val) : data(val), left(nullptr), right(nullptr) {} // 成员函数声明 static BST<Type>* Insert(BST<Type>* root, Type value); // 其他成员函数... };
这样类里的left、right指针类型和Insert方法的参数、返回类型才能统一,避免后续再出现类似的模板参数缺失问题。
内容的提问来源于stack exchange,提问作者Md Fairus
相关产品推荐
相关产品推荐

