模板函数递归调用,引用形参为指针时的问题
实现一个二叉树节点类,实现了一个清除节点的模板函数,当模板函数递归调用直接使用root_ptr->left()作为参数时编译会提示:
“data_structures::tree_clear”: 不能将参数 1 从“data_structures::binary_tree_node<Item> *”转换为“data_structures::binary_tree_node<Item> *&”
with
[
Item=std::string
]
data_structures是我定义的命名空间。这里复制代码时为了节省就不弄进来了。
如果先定义一个局部指针变量再把指针变量作为参数则可以编译通过。请看实现文件文件,如果我把left和right作为实参则没有问题。
开发工具:Visual Studio 2010 学习版。
头文件:
template<typename Item> class binary_tree_node { public: //TYPEDEF typedef Item value_type; //CONSTRUCTOR binary_tree_node(const Item& init_item = Item(), binary_tree_node* init_left = NULL, binary_tree_node* init_right = NULL); //MODIFICATION MEMBER FUNCTIONS void set_data(const Item &new_data); void set_left(binary_tree_node* new_left); void set_right(binary_tree_node* new_right); Item& data(){return data_field;} binary_tree_node* left(){return left_field;} binary_tree_node* right(){return right_field;} //CONST MEMBER FUNCTIONS const Item& data() const {return data_field;} const binary_tree_node* left() const {return left_field;} const binary_tree_node* right() const {return right_field;} bool is_leaf() const; private: Item data_field; //节点存储值 binary_tree_node* left_field; //左子节点 binary_tree_node* right_field; //右子节点 }; //删除二叉树 template<typename Item> void tree_clear(binary_tree_node<Item>*& root_ptr);
template <typename Item> binary_tree_node<Item>::binary_tree_node(const Item& init_item, binary_tree_node<Item>* init_left, binary_tree_node<Item>* init_right) :data_field(init_item), left_field(init_left), right_field(init_right){} template<typename Item> void binary_tree_node<Item>::set_data(const Item& new_data) { data_field = new_data; } template<typename Item> void binary_tree_node<Item>::set_left(binary_tree_node<Item>* new_left) { left_field = new_left; } template<typename Item> void binary_tree_node<Item>::set_right(binary_tree_node<Item>* new_right) { right_field = new_right; } template<typename Item> bool binary_tree_node<Item>::is_leaf() const { return (left_field == NULL) && (right_field == NULL); } template<typename Item> void tree_clear(binary_tree_node<Item>*& root_ptr) { if(root_ptr != NULL) { //binary_tree_node<Item>* left = root_ptr->left(); //binary_tree_node<Item>* right = root_ptr->right(); tree_clear(root_ptr->left()); tree_clear(root_ptr->right()); delete root_ptr; root_ptr = NULL; } }