首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

模板函数递归调用,引用形参为指针时的有关问题

2012-06-03 
模板函数递归调用,引用形参为指针时的问题实现一个二叉树节点类,实现了一个清除节点的模板函数,当模板函数

模板函数递归调用,引用形参为指针时的问题
实现一个二叉树节点类,实现了一个清除节点的模板函数,当模板函数递归调用直接使用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 学习版。
头文件:

C/C++ code
        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);


实现文件:
C/C++ code
    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;        }    }


[解决办法]
你返回的是一个指针,而你的tree_clear(binary_tree_node<Item>*& root_ptr)的参数是指针的引用。所以呢,不能绑定到一个临时的指针上面

热点排行